2013-03-18 94 views
11

我有以下Backbone.js的集合:如何更新集合中的模型?

var Tags = Backbone.Collection.extend({ 
     url: "/api/v1/tags/" 
}), 

如何更新集合中的车型之一,以便它发布到/ API/V1 /标签/ ID和保存数据,该模型。

所以,如果我收集 在更改产品型号名称与编号2应该投入到 /API/V1 /标签/ 2以下数据: 名称:新名称编号:2

+0

你试过'model.save({name:'new name'});'? – 2013-03-18 20:36:31

回答

2

你可以将变量传递给save方法。它接受jQuery的ajax方法使用的所有选项(除非你overrided Backbone.Sync

你可以这样做:

model.save({ name:'new name' });

idPUT方法会自动由Backbone为您添加。

+0

你也可以使用HTTP补丁来进行选择性更新 – 2013-03-21 10:20:06

21

我最近也想更新集合中的特定模型。问题是,如果我确实使用model.save它并没有更新集合。目标是更改收集中的模型,在服务器上更改它,相应地更新集合,而不是使用sync方法。所以例如我有我的变量collection,我想用id = 2更改模型。

所以第一件事情,我将创建一个实例模型,就像这样:
var model = collection.get(2)

然后我会更新这个特定型号的属性:
model.set({name: 'new name'})

然后我将它保存到服务器:
model.save({}, {url:'/api/v1/tags/'+model.get('id')})

然后我们必须相应地更新集合以适应更改:
collection.set({model},{remove: false})

set方法 - 这是通过参数中传递的模型列表对集合进行的“智能”更新。
remove: false参数 - 这是集合删除集合中现有模型的限制。更多here

7

您可能会错过的第一件事是,在您对应的标记模型中,您需要设置“urlRoot”以匹配Collection的“url”。否则,它不知道收集所有:

var Tag = Backbone.Model.extend({ 
    urlRoot: "/api/v1/tags" 
}); 

var Tags = Backbone.Collection.Extend({ 
    model: Tag, 
    url: "/api/v1/tags" 
}); 

如果要单独保存的标签,这是有用:

var tag = collection.get(2); 
tag.set({key: "something"}); 
tag.save(); // model.save works because you set "urlRoot" 

的收集,“创建()”也“ update()“如果id不为null。这并不令人困惑。 :)因此,这与前面的示例非常相似:

collection.create({id: 2; key: "something"}); 

这将更新id = 2的现有标记,然后触发PUT。

这是一个古老的问题;回答是因为我正在寻找相同的答案 - 你可能早就解决了这个问题,并且继续前进。 :)

相关问题