如何更新集合中的模型?

时间:2013-03-18 19:24:37

标签: backbone.js

我有以下Backbone.js集合:

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

如何更新集合中的某个模型,以便将其发布到/ api / v1 / tags / id并保存该模型的数据。

因此,如果我在集合中更改ID为2的模型名称 它应该PUT到 / api / v1 / tags / 2包含以下数据: name:新名称id:2

3 个答案:

答案 0 :(得分:22)

我最近也想更新集合中的特定型号。问题是,如果我只使用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方法 - 它是集合的“智能”更新,其中包含您在参数中传递的模型列表。 br /> remove: false参数 - 它是集合的一个限制,用于删除集合中的现有模型。更多here

答案 1 :(得分:8)

您可以忽略的第一件事是,在相应的Tag模型中,您需要设置“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"

在集合上,如果id不为null,“create()”也是“update()”。这并不令人困惑。 :)因此,这几乎与前面的示例相同:

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

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

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

答案 2 :(得分:2)

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

您可以执行以下操作:

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

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