我有一个简单的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;
}
});
})();
答案 0 :(得分:2)
当您从服务器发回数据时,您如何处理响应?例如,如果您只是发回[{},{},{}],我认为Backbone不会自动知道将其视为集合。因此,它将ContactPersons
属性设置为它所获得的属性,即你的vanilla数组。
你能做什么,是覆盖你的模型中的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()
之间的区别有所评论,我真的很欢迎这一输入。