2

改訂された質問

collection.resetメソッドとcollection.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()を実行しても、期待したのと同じ入力が得られないことを発見しました。たとえば、backbonejsのドキュメントに従っても、モデルの新しいリストまたはハッシュを使用してコレクションをリセットします。

モデルを一度に1つずつ追加および削除することはすべてうまくいきますが、変更するモデルが多すぎて、コレクションをまとめて更新したい場合があります。リセットを使用して、コレクションをモデルの新しいリスト(または属性ハッシュ)に置き換えます

キーワードはリストです。add()にモデルのリストを送信でき、うまく機能します。ただし、リセットで同じことを行うには、データがテンプレートとは異なる方法で送信されるため、そのデータを処理するために別のテンプレートを使用します。実演するためにjsfiddleを作成しました。

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

私がイライラしているのは、reset()がadd()とまったく同じように動作するはずだと思うことですが、そうではないようで、そうでない理由を考えることはできません。私はこれについて間違っていますか?

更新 私は自分の質問に答え始めたと思います。backback.jsのソースのresetメソッド内の745行目に、次のようなものがあります。

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

そして631行目で、addメソッドにこれが表示されます。

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

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

4

1 に答える 1

2

あなたの質問が正確に何であるかわからない。

ポストエディット

リセットイベントで渡されるオブジェクトは、コレクション自体です。

そのコレクション内のモデルを操作する場合は、getthroughを使用できますcollection.models。、、、、など、コレクションのアンダースコアで継承されたすべてのメソッドにアクセスできます。eachmapfilterfind

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

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

オリジナル

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

Addは、追加されたモデルごとに「add」イベントをトリガーします。

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

それらはまったく異なることをするために存在します。

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

ユーザーストーリーを想像してみてください。

モデルA、B、Cを含むコレクションがあるとします。

コレクションにモデルX、Y、Zが含まれるようにしたい

リセットを使用しない場合は、(擬似コードで)行う必要があります

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

リセットを使用すると、代わりに次のようになります。

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

最初のイベントは6つのイベントをトリガーし、2番目のイベントは1つのイベントをトリガーします。

リセットは、必要なことを実行するためのボックス内のもう1つのツールです。

于 2012-04-13T00:48:31.097 に答える