我有一个简单的 Backbone 模型,如下所示:
(function () {
App.Company = Backbone.Model.extend({
defaults: {},
urlRoot: "/Contacts/Companies",
initialize: function () {
var contactPersons = this.get("ContactPersons") || [];
this.set("ContactPersons", new App.ContactPersonCollection(contactPersons));
}
});
})();
每当我将模型保存到服务器时,ContactPersons
集合都会重置为 Array
。
保存模型后,我真的需要手动将其转为集合吗?
更新:这按预期工作 - 请参阅答案以获得更好的方法(恕我直言)
(function () {
App.Company = Backbone.Model.extend({
defaults: {},
urlRoot: "/Contacts/Companies",
initialize: function () {
var contactPersons = this.get("ContactPersons") || [];
if (_.isArray(contactPersons)) {
this.set("ContactPersons", new App.ContactPersonCollection(contactPersons));
}
},
parse: function (response) {
if (response.ContactPersons && _.isArray(response.ContactPersons)) {
response.ContactPersons = new App.ContactPersonCollection(response.ContactPersons);
}
return response;
}
});
})();
最佳答案
当您从服务器发回数据时,您如何处理响应?例如,如果您只是发回 [{},{},{}],我认为 Backbone 不会自动知道将其视为集合。因此,它将 ContactPersons
属性设置为它所获得的,您的原始数组。
您可以做的是在您的模型中覆盖您的 set 函数,该函数将获取传入的对象数组并适本地写入集合。看这个例子:
set: function(attributes, options) {
if (_.has(attributes, 'ContactPersons') && this.get("ContactPersons")) {
this.get('ContactPersons').reset(attributes.ContactPersons);
delete attributes.ContactPersons;
}
return Backbone.Model.prototype.set.call(this, attributes, options);
}
所以基本上只要您的服务器响应具有正确的命名空间 (response.ContactPersons),那么在解析后它会将您的响应传递给 set 函数。集合数据作为集合被特殊对待。在这里,我只是用新数据重置已经存在的集合。所有其他模型属性应继续传递给原始 set()
。
更新 - 对自己的答案越来越怀疑
我无法从脑海中摆脱这个问题/答案。它当然有效,但我越来越不相信使用修改后的 set()
与仅在 parse()
中做事更好。如果有人对在嵌套模型中使用修改后的 set()
与 parse()
之间的区别有一些评论,我非常欢迎您提供意见。
关于javascript - 主干模型 : Keep Collection when saving,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12142546/