2

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ですsetupdateHash上記の単純な例よりもコストが高い場合、これは実際の問題になる可能性があります。もう 1 つの問題は、オーバーライドされた関数が多くなり、セミボイラープレート コードが増え、コア メソッドにバグが発生する可能性が高くなることです。

議論のために、a) ハッシュの計算は高価であり、b) ハッシュは頻繁に参照されると仮定してください。

コレクションの状態をモデルで最新の状態に保つためのより良い方法はありますか?

4

2 に答える 2

1

私はこれについて間違っているかもしれませんが、あなたの「最大の問題」(あなたの言葉)は問題ではないと思います.

reset1回呼び出しますadd

// from backbone source - Backbone.Collection.reset
reset:
... code above ...
this.add(models, _.extend({silent: true}, options)); // note - silent:true
... code below ...

add1回呼び出しますset

// from backbone source - Backbone.Collection.add
add: function(models, options) {
  return this.set(models, _.defaults(options || {}, addOptions));
},

あなたがset(あなたが示したように)オーバーライドした場合updateHash、リセット時に一度だけ呼び出されます。

set:function() {
  Backbone.Collection.prototype.set.apply(this,arguments);
  this.updateHash();
},

ここにデモンストレーション用のフィドルがあります - http://jsfiddle.net/5ggCd/

また、オーバーライドする必要がありますremove

remove:function() {
  Backbone.Collection.prototype.remove.apply(this,arguments);
  this.updateHash();
},
于 2013-07-20T04:42:37.210 に答える
1

特定の情報を提供していないため、より詳細な回答を提供することは困難ですが、一般的に、あなたは物事を逆方向に行っています. 実際に必要になるまでハッシュを更新しないでください。

getHash : function(){
  return this.pluck('id').sort().join('|');
}

参照する代わりに、必要なときにいつでもthis.hash電話する必要があります。this.getHash()その後、同期の問題はすべて解消されます。

変更されたときに何かをしたい場合は、コレクションのイベントをリッスンしますが、コレクションがそれ自体をリッスンする必要がある状況があることを私に納得させるものは何もありません。

于 2013-07-19T20:33:17.617 に答える