2011-08-17 72 views
10

我有一個由Backbone.js集合和實時連接到服務器組成的應用程序。在不擦除舊模型的情況下更新Backbone.js集合

每當任何客戶端添加/刪除/更新集合中的模型時,更新後的集合將廣播到所有其他客戶端(而不是delta;整個集合)。

從其他客戶端處理此更新事件時,我發現更新集合的唯一方法是reset()。不幸的是,這抹掉了舊模型,並創建了新模型,以及所有與視圖有關的副作用。

是否有更新維護和更新原始模型(通過id進行比較)的集合的骨幹批准方式,僅在必要時創建/刪除它們?

UPDATE Backbone已添加Collection.set方法,該方法能夠更新現有模型。

+0

相關:https://github.com/documentcloud/backbone/issues/955 – philfreo

回答

8

我去解決的辦法是:

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

太好了。只是一件事......加上'回到這裏;'到最後。骨幹方法總是返回它們的上下文對象,所以你可以鏈接它們('my_col.update(x).toJSON()')。 – Jake

+0

完成。謝謝,傑克。 –

0

當你添加一個模型到集合然後'添加'回調被調用。利用它而不是重置。

+1

如果只有增量狀態在變化時廣播(例如「模型A被添加/刪除/更新」),這將是正確的解決方案。然而,整個系列都是重播,而不是一次重放,因此問題是如何保留現有模型的原始實例。 –

0

可以擴展集合的add方法,檢查那裏模型所有腦幹

相關問題