改訂質問コレクションのリセットと追加を使用する - なぜそれほど違いがありますか?
コレクション。リセットメソッドとコレクション。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を作成:
私はイライラを見つけることは、私はリセット()は正確に追加()ないように振る舞うべきだと思うことですが、それはしていないようだと私は考えることができませんなぜそうでないのかという良い理由。私はこれについて間違っていますか?
更新 私は自分自身の疑問に答え始めていると思います。
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
わかりましたが、基本的には、上で概説したコード(631行目と745行目)で実行されるトリガーは同じように動作するはずです。私の最初の質問は、なぜそれぞれが異なるタイプのオブジェクトを返すのかということでした。私は後で追加したアップデートを通して自分でそれに答えることになった。 –
EGでは、addメソッドとresetメソッドの両方でモデルのリストを取得しますが、トリガー(add)のモデルのリストを返し、もう一方(reset)は{_byCid:Object、_byId:Object、 _callbacks:オブジェクト、長さ:3、モデル:Array [3]、proto:x}この種のオブジェクトをリセットトリガーにバインドされている関数に戻すことの有用性を私は理解していません。モデルのプロパティに表示されるモデルの配列を返す方が理にかなっています。代わりに、 "this"では、reset()メソッドのスコープがトリガーに返されます。 –
または、リセットメソッド内でこのようなものが本当に役に立ちます... if(!options.silent)this.trigger( 'reset'、this、models、options);そのため、余分な作業をしなくても、同じ勢いですべてをリセットして追加したければ、簡単にできるはずです。 –