web-dev-qa-db-ja.com

Backbone.jsコレクションでfetch()を呼び出すと、どのイベントがトリガーされますか?

私のbackbone.jsアプリでは、Trips collectionを保持するTrip modelsがあり、これはLocalStorageで動作します。 Todos storeへの旅行を作成して保存するためにTrips.create(form_attributes)を呼び出すことができます。

最初にアプリをロードするとき、Trips.fetch({ success: trips_fetch_success })を呼び出します。trips_fetch_successは、Trip modelsが保持するTrips collectionを示す応答を受け取ります。

refreshおよびchangeイベントをTrips collectionにバインドしようとしましたが、これらのイベントはキャッチされていないため、どのイベントTrips.fetchがトリガーされるかについて間違った考えを持っていると思います。

私の質問:どのイベントがTrips.fetchトリガーする必要がありますか?そして、イベントはコレクションでトリガーされますか、それとも個々のTrip modelsでトリガーされますか?

68

Collection.fetch()は成功時にresetを呼び出し、これが「リセット」イベントをトリガーします。コレクションリセットイベントのサブスクライバーは、イベントを受信する必要があります。

ここで重要なのは「成功時」です。この問題が発生したのは、バックボーンがエラーメッセージを静かに飲み込んでいたことを発見するためだけでした。少なくともconsole.log()にログを記録するエラーハンドラーを渡し、何が起こっているのかを確認します。

trips.fetch({error: function() { console.log(arguments); }});

(注:古いバージョンのbackbone.jsは、「リセット」ではなく「更新」をトリガーします)

59
Elf Sternberg

バックボーン1.0を使用している場合、resetイベントにバインドするには、fetch()呼び出しでreset:trueを渡す必要があります。

trips.fetch({reset: true});
52
jesal

バックボーン1.0の時点で、model.fetch()は「同期」をトリガーします。それはあなたがバインドすべきものです。

「sync」イベントが発生するbackbone.jsソースからの関連部分は次のとおりです。

fetch: function(options) {
  options = options ? _.clone(options) : {};
  if (options.parse === void 0) options.parse = true;
  var model = this;
  var success = options.success;
  options.success = function(resp) {
    if (!model.set(model.parse(resp, options), options)) return false;
    if (success) success(model, resp, options);

    // HERE'S THE TRIGGER!
    model.trigger('sync', model, resp, options);

  };
  wrapError(this, options);
  return this.sync('read', this, options);
},
20
Perry Tew