在不擦除旧模型的情况下更新Backbone.js集合

时间:2011-08-17 18:15:53

标签: backbone.js

我有一个应用程序,它包含一个Backbone.js集合以及与服务器的实时连接。

每次任何客户端在集合中添加/删除/更新模型时,更新的集合都会广播到所有其他客户端(不是delta;整个集合)。

当从其他客户端处理此更新事件时,我发现更新集合的唯一方法是reset()。不幸的是,这会擦除旧模型并创建新模型,以及所有与视图相关的副作用。

是否有一种Backbone认可的方式来更新维护和更新原始模型的集合(通过id进行比较),仅在必要时创建/删除它们?

更新 Backbone添加了Collection.set方法,该方法可以更新现有模型。

3 个答案:

答案 0 :(得分:9)

我选择的解决方案是:

Backbone.Collection.prototype.update = function(colIn){  

  var ids = [];

  _(colIn).each(function(modIn){
    var existing = this.get(modIn);
    // update existing models
    if (existing) { existing.set(modIn); }
    // add the new ones
    else { this.add(modIn); }

    ids.push(modIn.id);
  }, this);

  // remove missing models (optional)
  var toRemove = this.reject(function(model){
    return _(ids).include(model.id);
  });

  this.remove(toRemove);
  return this;
};

答案 1 :(得分:0)

将模型添加到集合时,将调用“add”回调。利用它而不是重置。

答案 2 :(得分:0)

您可以扩展集合的add方法并检查其是否存在模型