【问题标题】:Updating a Backbone.js collection without wiping old models在不擦除旧模型的情况下更新 Backbone.js 集合
【发布时间】:2011-10-29 04:14:08
【问题描述】:

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

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

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

是否存在经 Backbone 认可的更新集合的方法,以维护和更新原始模型(按 id 进行比较),仅在必要时创建/删除它们?

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

【问题讨论】:

标签: backbone.js


【解决方案1】:

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

【讨论】:

  • 如果仅在更改时广播增量状态(例如,“模型 A 已添加/删除/更新”),这将是正确的解决方案。但是,整个集合是重播的,而不是一次重播,所以问题是,如何保留现有模型的原始实例。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我采用的解决方案是:

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

    【讨论】:

    • 太棒了。只有一件事......在末尾添加return this;。主干方法总是返回它们的上下文对象,因此您可以将它们链接起来 (my_col.update(x).toJSON())。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多