ルーター オブジェクトで、ビュー間で共有するイベント オブジェクトを作成しました
イベント オブジェクトをビューに渡します
この共有オブジェクトにイベントを次のように登録します
var productCatalogView = Backbone.View.extend({
initialize: function (options) {
//bind alert event to sharedEvents
options.sharedEvents.bind("alert", this.alert,this);
},
alert: function () {
alert('alerted');
}
});
//次のビューはアラート イベントをトリガーします
var testView = Backbone.View.extend({
initialize: function (options) {
this.sharedEvents = options.sharedEvents;
},
events: {
'click #test': 'triggerAlert'
},
triggerAlert: function (e) {
this.sharedEvents.trigger("alert", null);
}
});
問題: 私が経験する問題は、アラート イベント (2 番目のビュー) をトリガーするボタンを初めてクリックしたときに、アラート イベントが 1 回呼び出される (良い) ことです。検索パラメーターを渡すルート、したがって最初のビューを作成し、sharedEvents を再度バインドするため、アラートイベントを 2 回トリガーすると、2 回トリガーされ (悪い)、次に同じプロセスを繰り返すと、3 回トリガーされます。などなど。最初のビューのイベントバインディングに関係していると思います。つまり、ビューが初期化されるたびに(私が正しい場合)、イベントのバインディングを1回発生させるにはどうすればよいですか。
ビューを初期化する方法を示すルーターは次のとおりです。
var Router = Backbone.Router.extend({
sharedEvents:_.extend({},Backbone.Events),
catalog: function (id) {
//....unecessary code left out
var productView = new ProductView({sharedEvents:this.sharedEvents});
this.renderView(productView);
this.renderView(new testView({sharedEvents: this.sharedEvents }));
}
renderView: function (view) {
if (null != this.currentView) {
this.currentView.undelegateEvents();
// this.currentView.remove();
}
this.currentView = view;
this.currentView.render();
}
});
私はこの解決策を試しましたが、問題は解決しません、ありがとう