私の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
でトリガーされますか?
Collection.fetch()
は成功時にreset
を呼び出し、これが「リセット」イベントをトリガーします。コレクションリセットイベントのサブスクライバーは、イベントを受信する必要があります。
ここで重要なのは「成功時」です。この問題が発生したのは、バックボーンがエラーメッセージを静かに飲み込んでいたことを発見するためだけでした。少なくともconsole.log()
にログを記録するエラーハンドラーを渡し、何が起こっているのかを確認します。
trips.fetch({error: function() { console.log(arguments); }});
(注:古いバージョンのbackbone.jsは、「リセット」ではなく「更新」をトリガーします)
バックボーン1.0を使用している場合、resetイベントにバインドするには、fetch()呼び出しでreset:trueを渡す必要があります。
trips.fetch({reset: true});
バックボーン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);
},