javascript - 主干模型 : Keep Collection when saving

标签 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;
        }
    });

})();

最佳答案

当您从服务器发回数据时,您如何处理响应?例如,如果您只是发回 [{},{},{}],我认为 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/

相关文章:

javascript - 2D 游戏中的 keyPressed 倒置 [P5.js]

javascript - 无法理解backbone.js教程示例

javascript - 主干事件映射不工作

javascript - Browserify 在大型 Web 项目中的最佳实践 - Gulp

javascript - 以随机方式取出数组中的所有元素?

javascript - 如何使用vue获取所选<td>的文本?

javascript - 在 backbone.js 中使用 jQuery UI 拖放

Javascript 文件加载后备。 document.write() 的替代方案

javascript - Backbone JS : Modify a single model from different views

backbone.js - Backbone 触发链接点击导航的首选方式?