【问题标题】:Backbone.js: Update Collection with different dataBackbone.js:使用不同的数据更新集合
【发布时间】:2012-05-25 06:11:05
【问题描述】:

我有一个模型的主干集合,这些模型在页面加载时传入的数据与获取时不同。

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

[{ 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 }]

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

【问题讨论】:

  • 定义“保留”。您的意思是将旧数据保存到某个变量中吗?还是更多地将新旧数据保存在同一个集合实例中?
  • 后者(将新旧数据保存在同一个集合实例中)
  • 那么内置的fetch() 不做你想做的事吗? From the docs如果您想将传入模型添加到当前集合中,而不是替换集合的内容,请将 {add: true} 作为获取选项传递。
  • @CrescentFresh 但 fetch 不会更新/添加任何 id 尚未存在的模型。所以问题的集合不会改变。

标签: javascript backbone.js backbone.js-collections


【解决方案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 的使用,这很重要,以便可以通过主干模型对象中使用的任何“id”属性来识别模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    相关资源
    最近更新 更多