2011-08-17 20 views
10

私は、Backbone.jsコレクションとサーバーへのリアルタイム接続で構成されるアプリケーションを持っています。古いモデルを消去せずにBackbone.jsコレクションを更新する

クライアントがコレクション内のモデルを追加/削除/更新するたびに、更新されたコレクションが他のすべてのクライアント(デルタではなくコレクション全体)にブロードキャストされます。

他のクライアントからのこのアップデートイベントを処理するとき、コレクションを更新する唯一の方法はリセット()です。残念なことに、これは古いモデルを消去し、ビュー関連のすべての副作用とともに新しいモデルを作成します。

元のモデルを保持および更新する(IDで比較する)コレクションを更新し、必要な場合にのみ作成/削除するコレクションを更新する方法はありますか?

更新バックボーンには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

素晴らしい。ちょうど一つのこと...最後に 'return this;'を追加してください。バックボーン・メソッドは常にコンテキスト・オブジェクトを戻しますので、それらをチェーンすることができます( 'my_col.update(x).toJSON()')。 – Jake

+0

完了。ありがとう、ジェイク。 –

0

コレクションにモデルを追加すると、「追加」コールバックが呼び出されます。それをリセットの代わりに使用してください。

+1

デルタ状態だけが変更時にブロードキャストされた場合(たとえば、「モデルAが追加/削除/更新されました」)、これが正しい解決策になります。しかし、コレクション全体が一度に1つずつではなく再放送されるので、問題は、既存のモデルの元のインスタンスを保持する方法です。 –

0

あなたがコレクションのadd方法を拡張し、モデルexistanceのためにそこに

関連する問題