BackboneCollection
があり、独自の更新 (つまり、追加、削除、リセット) に何らかの方法で応答するようにしたいと考えています。私はさまざまなシナリオでこれに遭遇しましたが、議論のために、コレクションをすばやく比較するために、モデル ID に基づいてハッシュを計算しているとしましょう。
var HashedCollection = Backbone.Collection.extend({
updateHash: function() {
// set a simple hash based on model id
this.hash = this.pluck('id').sort().join('|');
}
});
問題は、ハッシュを最新の状態に保つ正しい方法は何ですか?
可能なオプション:
イベントのセルフリスナーを設定します。
this.on('add remove reset', this.updateHash, this);
initialize
これに関する問題は、一部のアクションがサイレントになる可能性があることですが、それでもハッシュを更新したいです。これは特に、コレクションがまだモデルを持っていないため発生できない初めてのセットの問題です。初期リセットイベントはサイレントです(関連コード)。さらに、 を渡すだけで、他のコンポーネントがコレクションの状態を台無しにする可能性があることを意味します{ silent: true }
。.add
、.remove
、.reset
、および/またはの関数オーバーライドを設定します.set
。set: function() { Backbone.Collection.prototype.set.apply(this, arguments); this.updateHash(); } // etc
ここでの最大の問題は、単一の
add
/set
呼び出しと複数の呼び出しをreset
処理reset
するadd
ことset
ですset
。updateHash
上記の単純な例よりもコストが高い場合、これは実際の問題になる可能性があります。もう 1 つの問題は、オーバーライドされた関数が多くなり、セミボイラープレート コードが増え、コア メソッドにバグが発生する可能性が高くなることです。
議論のために、a) ハッシュの計算は高価であり、b) ハッシュは頻繁に参照されると仮定してください。
コレクションの状態をモデルで最新の状態に保つためのより良い方法はありますか?