3

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

})();
4

1 回答 1

2

当您从服务器发回数据时,您如何处理响应?例如,如果您只是发回 [{},{},{}],我认为 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(),我真的很欢迎输入。

于 2012-08-27T14:10:06.593 回答