Backbone.js:使用不同的数据更新集合

我有一个模型的Backbone集合,它在页面加载时比在提取时有不同的数据。

例如,在页面加载时进入的属性是:

[{ name: 'cat', color: 'yellow' },
 { name: 'dog', color: 'brown' },
 { name: 'fish', color: 'orange' }]

然后,在fetch()(或者在页面存在时从服务器更新)时,数据如下所示:

[{ name: 'cat', current: 5, total: 100 },
 { name: 'dog', current: 6, total: 50 },
 { name: 'fish', current:7, total: 25 }]

如何在保留旧数据的同时使用新数据更新Backbone Collection? ID不从服务器分配(名称保证唯一)。

1
额外 编辑
意见: 1
定义“保留”。你的意思是将旧数据保存到一些变量中?或者更多的保留旧的和新的数据在同一个集合实例中?
额外 作者 Crescent Fresh,
那么内置的 fetch()不是你想要的吗? 从文档如果您想添加传入模型到当前集合,而不是替换集合的内容,请传递 {add:true} 作为提取选项。
额外 作者 Crescent Fresh,
后者(将旧数据和新数据保存在同一个集合实例中)
额外 作者 Muers,
@CrescentFresh但是fetch不会更新/添加任何带有id的模型。所以这个问题的集合不会改变。
额外 作者 theotheo,

1 答案

我结束了这个。这将更新存在的模型的属性,同时还删除未添加的模型并添加新的模型。

Backbone.Collection.prototype.update = function(col_in){  
  var self = this,
      new_models = [];

  _(col_in).each(function(mod_in) {
    var new_model = self._prepareModel(mod_in),
        mod = self.get(new_model.id);
    if (mod) { 
      new_models.push(mod.set(mod_in, {silent:true}));
    } else { 
      new_models.push(mod_in);
    }
  });

  this.reset(new_models);
};

请注意, _prepareModel 的使用非常重要,以便可以通过Backbone Model对象中使用的任何“id”属性来标识模型。

0
额外