我有以下Backbone.js集合:
var Tags = Backbone.Collection.extend({
url: "/api/v1/tags/"
}),
Run Code Online (Sandbox Code Playgroud)
如何更新集合中的某个模型,以便将其发布到/ api/v1/tags/id并保存该模型的数据.
因此,如果我在集合中更改ID为2的模型的名称它应该使用以下数据PUT到/ api/v1/tags/2:name:new name id:2
Pro*_*kov 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方法 - 它是一个使用参数传递的模型列表对集合进行"智能"更新.
remove: false参数 - 它是集合的一个限制,用于删除集合中的现有模型.更多这里.
您可以忽略的第一件事是,在相应的Tag模型中,您需要设置"urlRoot"以匹配Collection的"url".否则它根本不知道该集合:
var Tag = Backbone.Model.extend({
urlRoot: "/api/v1/tags"
});
var Tags = Backbone.Collection.Extend({
model: Tag,
url: "/api/v1/tags"
});
Run Code Online (Sandbox Code Playgroud)
如果要单独保存标记,这非常有用:
var tag = collection.get(2);
tag.set({key: "something"});
tag.save(); // model.save works because you set "urlRoot"
Run Code Online (Sandbox Code Playgroud)
在集合上,如果id不为null,"create()"也是"update()".这并不令人困惑.:)因此,这几乎与前面的示例相同:
collection.create({id: 2; key: "something"});
Run Code Online (Sandbox Code Playgroud)
这将更新id = 2的现有标签,然后触发PUT.
这是一个古老的问题; 回答,因为我正在寻找相同的答案 - 你可能早已解决了这个问题并继续前进.:)
您可以将变量传递给该save方法。它接受 jQuery 方法使用的所有选项ajax(除非您覆盖Backbone.Sync)
你可以这样做:
model.save( { name:'new name' } );
Backbone 会自动为您添加id和方法。PUT