Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不删除旧模型的情况下更新Backbone.js集合_Backbone.js - Fatal编程技术网

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

在不删除旧模型的情况下更新Backbone.js集合,backbone.js,Backbone.js,我有一个由Backbone.js集合和到服务器的实时连接组成的应用程序 每次任何客户端在集合中添加/删除/更新模型时,更新的集合都会广播到所有其他客户端(而不是增量;整个集合) 从其他客户端处理此更新事件时,我发现更新集合的唯一方法是重置()。不幸的是,这会抹去旧模型并创建新模型,以及所有与视图相关的副作用 是否有一种主干网认可的更新集合的方法来维护和更新原始模型(通过id进行比较),仅在必要时创建/删除它们 更新主干添加了能够更新现有模型的方法。将模型添加到集合时,将调用“添加”回调。使用它而

我有一个由Backbone.js集合和到服务器的实时连接组成的应用程序

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

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

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


更新主干添加了能够更新现有模型的方法。

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

您可以扩展collection的
添加方法,并在那里检查模型是否存在。

我使用的解决方案是:

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;
};

如果更改时仅广播增量状态(例如“添加/删除/更新了模型A”),这将是正确的解决方案。然而,整个集合是重播的,而不是一次一个,所以问题是,如何保留现有模型的原始实例。只有一件事。。。添加
并返回此项结束。主干方法总是返回它们的上下文对象,以便可以链接它们(
my_col.update(x).toJSON()
)。