我希望能够在骨干模型上调用save()并让后端返回此模型的整个集合,而不是仅返回模型的已更改属性。然后我想骨干更新整个返回的集合。用例如下:
用户有多个地址,可以从此集合中选择送货地址。如果她从集合中选择不同的送货地址,则先前的送货地址应更新为“只是另一个普通地址”的状态。为此,必须更新整个集合,而不仅仅是更改的模型。
在backbone.js中这有可能吗?
提前多多感谢!
答案 0 :(得分:4)
绑定到集合的模型,将其集合父级包含为属性。此外,由于您返回了一个模型列表,我们可以假设它总是在列表中。
mymodel = Backbone.Model.extend({
parse: function (data) {
if(this.collection && typeof(data) === 'array') {
this.collection.reset(data);
}
return data;
}
});
答案 1 :(得分:2)
我不认为在这里必须超越同步或打破保存退货的期望。
我想在模型上覆盖save
会更简单,其中包括以下内容:
save: function (key, value, options) {
var p = Model.prototype.save.call(this, key, value, options),
self=this;
if (this.collection) {
p.done(function () { self.collection.fetch(); });
}
return p;
}
将使用正常save
获取其承诺进行保存,然后如果保存成功且模型是集合的一部分,它将从服务器获取集合。
另一种方法是绑定到模型的change
事件,检查它是否属于集合和提取,但这也会发生在set
上。
答案 2 :(得分:1)
sync
函数
MyModel = Backbone.Model.extend({
sync: function(method, model) {
if (method === 'create') {
//perform save logic and update the model's collection
} else if (method === 'update') {
//perform save logic and update the model's collection
} else if (method === 'read') {
...
} else if (method === 'destroy') {
...
}
}
});
有关详细信息,请查看Backbone.sync函数。
答案 3 :(得分:0)
您的用例实际需要的是更新两个模型,而不是更新整个集合。 (除了提取之外,集合不与Backbone中的服务器交互。)假设您有地址A,B和C,其中A作为当前发货地址,C作为新的发货地址,您的代码可以简单地:
如果您的问题是知道哪个地址是当前地址(即地址A),那么您可以在您的收藏中搜索它(即“给我当前送货地址“),更新C,然后更新返回的地址(地址A)。
如果绝对需要更新整个集合(您没有),请循环浏览collection.models
并单独更新每个集合。在一个集合的Backbone中,没有任何概念可以作用于RESTful。
编辑:我可能误解了您的问题。如果您的意思是更新客户端上的集合(即,您不打算更新服务器上的集合),那么代码仍然类似,您只需更新旧模型和新模型。