2013-08-09 29 views
5

簡単な質問:「一度だけ」イベントを発生させる最良の方法は何ですか?バックボーン:コレクション '変更'でイベントを1回だけ発生する

私は複数のモデルを持つバックボーンのコレクションを持っています。時には複数のモデルの属性が一度に更新され、コレクションの複数の「変更」イベントが発生します。

すべての属性の変更をまとめてグループ化する「変更」イベントを1回だけ発生させる最善の方法は何ですか?

今の私のベストアイデアは、タイマーを使用していますが、これは最初のモデル属性変更をキャプチャするだけです。

すべての提案、アイデア、解決策が評価されます。ありがとうございました :)。


コンテキスト: この場合、イベントは、したがって、複数の実行は避けなければならない、非常に計算集約機能を起動します。あなたが一括でモデルの属性を更新するたび

答えて

4

will suppress any events from being fired.

が続いビューまたは複数のビューが同じに耳を傾けれるカスタムイベントをトリガされ、オプションとして{silent:true}を渡します。

+3

これは回避策であり正しい解決策ではありません。より良い解決法は、 'add'の代わりに' reset'を使うことです。単一の 'reset'イベントが呼び出されます。 –

2

することはでき「デバウンス」を手動で変更したモデルを把握する必要がありますが、イベントを変更するには応答し、あなたのコレクション内の方法:

Col = Backbone.Collection.extend({ 
    modelChanged: _.debounce(function() { 
     // handle model changes 
    }, delayInMs), 
    initialize: function() { 
     this.collection.on('change', this.modelChanged, this); 
    } 
}) 
2

あなたは、コレクションをリセットするのではなく、追加してみてくださいすることができます要素。

はすべてが順調と良いです一度モデル1の追加と削除collection.reset([models], [options])

をリセットし、時にはあなたがいうだけでコレクションを更新したいことを変更するので、多くのモデルがあります:Collection reset method descriptionを参照してください。バルクリセットを使用して、コレクションを新しいモデルのリスト(または属性ハッシュ)に置き換え、最後に単一の「リセット」イベントをトリガーします。新しく設定されたモデルを返します。便宜上、「リセット」イベント内で、以前のモデルのリストはoptions.previousModelsとして利用できます。あなたがresetを使用した場合のドキュメントとして

ではなくaddのあなたが最後に単一resetイベントを取得します、と言います。

+1

オプションで{{reset:true} 'を渡さない限り、コレクションの' fetch() 'は変更されたすべてのモデルの変更イベントを生成することに注意してください。 – mix3d

関連する問題