2

私は Backbone を使用しており、7 つのモデルでいっぱいのコレクションがあります。

ひとつのモデルを手に取ってコレクションから抜き出したい。ただし、試したものはすべて返されますundefined

コレクションにデータを入力する方法は次のとおりです

var coll = new TestCollection();
coll.fetch();

単純なコンソール ログ呼び出しは、コレクションが JSON ファイルから取り込まれたことを示しています。

child
_byCid: Object
_byId: Object
_onModelEvent: function () { [native code] }
_removeReference: function () { [native code] }
length: 7
models: Array[7]
__proto__: ctor

ただし、コレクションからこれらのモデルのいずれかを取得するために、さまざまなアプローチを試みましたcoll.at(1)coll.get(1)、それぞれが を返しますundefined

誰にもアイデアはありますか?

4

1 に答える 1

5

このfetchメソッドは AJAX 呼び出しであり、非同期であることを意味します。あなたのconsole.log呼び出しは、ライブ参照をコンソールに入れます (つまり、非同期のようなものです)。そのため、次の一連のイベントが発生します。

  1. を呼び出しますcoll.fetch()
  2. バックボーンが$.ajaxコールを送信します。
  3. 呼び出すconsole.log(coll)と、ライブ参照がコンソールに表示されます。
  4. 2はまだサーバーから返されていないため、coll.at(1)orを呼び出しても何も得られません。coll.get(1)
  5. 2 がサーバーから戻ってきて、コレクションに入力します。
  6. 次に、コンソールを見に行きますが、これcollまでにデータが取り込まれているため、コンソールの参照には5collで戻ってきたモデルが含まれています。
  7. 錯乱。

成功するとイベントfetchがトリガー"reset"されるため、コレクションがいつ作成されるかを知りたい場合は、そのイベントをリッスンする必要があります。

coll.on('reset', this.some_method);

または、ワンショット通知の場合は、successコールバックを使用できます。

coll.fetch({
    success: function(collection, response) {
        //...
    }
});

Backbone の新しいバージョンでは、リセット イベントが必要な場合にreset: trueオプションを渡す必要があります。fetch

coll.fetch({ reset: true }); // This will now trigger a 'reset' event
于 2012-07-18T19:45:52.867 に答える