Backbone Model:保存时保留集合

时间:2012-08-27 13:04:21

标签: javascript backbone.js

我有一个简单的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;
        }
    });

})();

1 个答案:

答案 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()之间的区别有所评论,我真的很欢迎这一输入。