如何在集合提取上保留自定义属性

时间:2012-12-21 02:23:30

标签: backbone.js

我有一个“资产”主干模型,它有一个名为“selected”的自定义属性。它的定制意味着它不是服务器端对象的一部分。我用来表示用户当前选择的资产列表。

var Asset = Backbone.Model.extend({
    defaults: {
        selected: false
    },

    idAttribute: "AssetId"
});

此模型是我定期获取以从服务器获取任何更改的主干集合的一部分。

我遇到的问题是,每次我获取集合时,集合都会进行重置(我可以通过侦听重置事件来判断),因此所选属性的值会被进入的数据消除来自ajax请求。

backbone.js文档似乎表明有一个智能合并可以解决这个问题。我相信我在我的获取方法中这样做

 allAssets.fetch({  update: true ,cache: false});

我还在模型中设置了“idAttribute”字段,以便可以将进入的对象的id与集合中的对象进行比较。

我解决这个问题的方法是在我的集合对象中编写自己的Parse方法

 parse: function (response) {
    // ensure that the value of the "selected" for any of the models
    // is persisted into the model in the new collection
    this.each(function(ass) {
        if (ass.get("selected")) {
            var newSelectedAsset = _.find(response, function(num) { return num.AssetId == ass.get("AssetId"); });
            newSelectedAsset.selected = true;
        }
    });
    return response;
}

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

Collection.update(在Backbone 0.9.9中引入)确实尝试合并现有模型,但是通过将新模型中的所有集合属性合并到旧模型中来实现。如果您选中Backbone source code,则会看到

if (existing || this._byCid[model.cid]) {
    if (options && options.merge && existing) {
        existing.set(model.attributes, options);
        needsSort = sort;
    }
    models.splice(i, 1);
    continue;
}

设置所有属性(包括默认值),这就是您选择的属性重置为false的原因。删除所选的默认值将按预期工作:将http://jsfiddle.net/nikoshr/s5ZXN/http://jsfiddle.net/nikoshr/s5ZXN/3/

进行比较

那就是说,我不会依赖模型属性来存储我的应用程序状态,我宁愿将其移动到其他地方的控制器。