2012-04-12 15 views
2

改訂質問コレクションのリセットと追加を使用する - なぜそれほど違いがありますか?

コレクション。リセットメソッドとコレクション。addメソッド。どちらもモデルのリストを入力として受け取ります。しかし、リセットは、単一の「リセット」イベントが発生したときに、このようなオブジェクト上に戻ります。

{d, 
_byCid: Object, 
_byId: Object, 
_callbacks: Object, 
length: 3, 
models: Array[3], 
__proto__: x} 

ただし、addメソッドは、models:Array [n]オブジェクトの上にある単純な配列を返します。以下のサンプルコードでaddRenderメソッドに表示されているようなことをするのは簡単です。しかし、同じことをしようとするときには、同じモデルのリストを取得して処理するために余分な作業を行う必要があります。

質問:これらのメソッド(追加とリセット)は、2つの異なる種類のオブジェクトを似たようなことをするときになぜ返すのですか?モデルのリストを追加して追加します。リセットし、既存のコレクションを削除し、モデルのリストで置き換えます。追加トリガーから返されるものがモデルの場合、リセットトリガーから返すのはthisです。どのような良い(例を挙げてください)コレクションオブジェクトを返すのはモデルだけですか?

---以下、元の質問---

私はBACKBONE.JSの使い方を学んでいますし、コレクションを実験してきました。私は、foo.add()を呼び出すことによってコレクションに多くのモデルを追加することが簡単であることを発見しました。ここで、fooはコレクションです。私はfoo.reset()を実行すると、私が期待するのと同じ入力を受けないが、発見した。 EG、でもbackbonejsのドキュメントによると、モデルの新しいリストやハッシュでコレクションをリセットします。

はモデル1の追加と削除時にすべてが順調と良いですが、 は時々、あなたは非常に多くのモデルを持っていますあなたはむしろちょうど コレクションをまとめて更新したいと思うことを変更してください。リセットを使用して のコレクションを置き換える新しいモデルのリスト(または属性ハッシュ)

キーワードがリストにあります。私はadd()するモデルのリストを送ることができ、それは素晴らしい作品です。しかし、同じことをリセットで行うには、別のテンプレートを使用してそのデータを処理します。これは、テンプレートと異なる送信が行われるためです。私は証明するためにjsfiddleを作成:

http://jsfiddle.net/pLytF/2/

私はイライラを見つけることは、私はリセット()は正確に追加()ないように振る舞うべきだと思うことですが、それはしていないようだと私は考えることができませんなぜそうでないのかという良い理由。私はこれについて間違っていますか?

更新 私は自分自身の疑問に答え始めていると思います。

if (!options.silent) this.trigger('reset', this, options); 

をそしてライン631で、あなたはaddメソッドでこれが表示されます:BACKBONE.JSのソースでは、リセット方法内の行745で、あなたは見つけることができます

model.trigger('add', model, this, options); 

これは最初にresetメソッドから、2番目はaddメソッドからです。リセットの場合、 "this"は渡され、addが渡すものとは異なる構造を保持します。 Addは個々のモデルを渡しますが、resetはすべてのモデルの配列を指すプロパティを持つオブジェクトを渡します。これは私がjsfiddleで見たものを説明しています。私はこれがドキュメントで実際に記述されている動作であるかどうかはわかりません。 Hmm

答えて

2

あなたの質問は正確ではありません。

ポスト編集

reset eventに渡されたオブジェクトがコレクションそのものです。

コレクション内のモデルで操作したい場合は、collection.modelsから取得することができます。コレクションのunderscore-inherited methodseachmapfilterfindなど)にアクセスできます。

リセットイベントを処理するためのあなたのコードは次のようになります。

resetRender: function(collection) { 
    collection.each(function(model){ 
     this.addRender(model); 
    }); 
    return this; 
} 

オリジナル

Addをコレクションにすでにすべてのモデルを維持し、モデルの既存のコレクションにモデルを追加します。 Resetは、現在のモデルのセットをに置き換え、モデルまたはオブジェクトをリセットに渡しますが、コレクションの既存のモデルは保持されません。

トリガを追加すると、追加されたモデルごとに「追加」イベントが追加されます。

リセットは、セット全体に対して1回の「リセット」をトリガします。

全く異なることが存在します。

リセットは、一般的にデータのセットで一括してロードするために使用されます。たとえば、最初のページの読み込み時にブートストラップされたデータをjavascript変数として配信した場合、データ。リセットは、{add: true}オプションが指定されていない限り、フェッチ後にコレクションを設定するためにも使用されます。

ユーザーストーリーを想像:Z

、、、B、Cの

私はコレクションは今モデルXを含むようにしたいYをモデルAを含むコレクションを考えると

リセットを使用しない

、あなたがしなければならない

while collection.length 
    collection.pop() 
collection.add([X,Y,Z]) 

(擬似コードで)リセットを使用して、あなたの代わりにだけ実行します。

collection.reset([X,Y,Z]) 

最初のトリガー6つのイベント、第二のトリガー1

リセットを簡単にやって必要なものを行うためのボックス内の1つの以上のツールです。

+0

わかりましたが、基本的には、上で概説したコード(631行目と745行目)で実行されるトリガーは同じように動作するはずです。私の最初の質問は、なぜそれぞれが異なるタイプのオブジェクトを返すのかということでした。私は後で追加したアップデートを通して自分でそれに答えることになった。 –

+0

EGでは、addメソッドとresetメソッドの両方でモデルのリストを取得しますが、トリガー(add)のモデルのリストを返し、もう一方(reset)は{_byCid:Object、_byId:Object、 _callbacks:オブジェクト、長さ:3、モデル:Array [3]、proto:x}この種のオブジェクトをリセットトリガーにバインドされている関数に戻すことの有用性を私は理解していません。モデルのプロパティに表示されるモデルの配列を返す方が理にかなっています。代わりに、 "this"では、reset()メソッドのスコープがトリガーに返されます。 –

+0

または、リセットメソッド内でこのようなものが本当に役に立ちます... if(!options.silent)this.trigger( 'reset'、this、models、options);そのため、余分な作業をしなくても、同じ勢いですべてをリセットして追加したければ、簡単にできるはずです。 –

関連する問題