以下は私のバックボーンビューです。
define([
'app',
'backbone',
'twig',
'templates/report',
'data/reportViewCollection',
'data/reportViewModel'
], function (app, Backbone, Twig, template, Collection, Model) {
var collection = new Collection();
var fetching;
return Backbone.View.extend({
setParams: function (rlId, viewId, categoryId, depth) {
// reset any possible pending previous repests.
fetching = false;
var model = collection.getModel(rlId, viewId, categoryId, depth);
if (!model) {
model = new Model({
rlId: rlId,
viewId: viewId,
categoryId: categoryId,
depth: depth
});
fetching = model.fetch({
success: function (model) {
collection.add(model);
},
error: function (model) {
alert('error getting report view');
}
});
}
this.model = model;
},
render: function () {
var that = this;
var done = function() {
app.vent.trigger('domchange:title', that.model.get('title'));
that.$el.html(Twig.render(template, that.model.toJSON()));
that.delegateEvents(that.events);
fetching = false;
};
if (fetching) {
app.loading(this);
fetching.done(done);
} else {
done();
}
return this;
},
events: {
'change select.view-select': 'viewSelect',
'click #dothing': function (e) {e.preventDefault(); alert('hi');}
},
viewSelect: function(e) {
var selectedView = $(e.target).val();
var rlId = this.model.get('rlId');
if (!rlId) rlId = 0;
var url = 'report/' + rlId + '/' + selectedView;
console.log(this, e, url);
Backbone.history.navigate(url, {trigger: true});
}
});
});
機能の説明:
特定のURLに移動するとsetParams()
、サーバーからモデルをフェッチするために関数が呼び出されます。renderメソッドが呼び出されると、現在モデルをフェッチしているかどうかをチェックし、フェッチしている場合は、フェッチが完了したときにテンプレートをレンダリングするために遅延コールバックを設定します。モデルがフェッチされ、レンダリングの準備ができたら、テンプレートをレンダリングし、ビューに。で入力しthat.$el.html()
ます。
問題:
何が起こるかというと、最初にURLに移動したときにイベントは完全に機能しますが、戻るボタンを押してもイベントは添付されません。
コードをステップスルーしましたが、違いはわかりません。唯一の本当の違いは、モデルcollection
をフェッチするためにajaxリクエストを実行するのではなく、キャッシュされたモデルからモデルをロードしていることです。
何が起こっているのか手がかりはありますか?