這是因爲註冊on
多次完成,某處未顯示在您的問題中,而且應該只執行一次。
✘不要這樣做
var view = Backbone.View.extend({
events: {
"click": "onClick"
},
onClick: function(e) {
App.actionsChannel.on('action:triggered', function(actionName) {
//do some ajax requests
});
}
});
✔做這個
var view = Backbone.View.extend({
events: {
"click": "onClick"
},
initialize: function(){
App.actionsChannel.on('action:triggered', this.onActionTriggered);
},
onClick: function(e) {
// or if you must register it here for example.
// First make sure it's unregistered.
App.actionsChannel.off('action:triggered', this.onActionTriggered);
App.actionsChannel.on('action:triggered', this.onActionTriggered);
},
onActionTriggered: function(actionName) {
//do some ajax requests
},
});
使用on
功能多次只是增加了一個偵聽器添加到列表中。所以,當被觸發時,回調會被調用很多次,因爲它被註冊了。
最好
建議使用listenTo
代替on
儘可能避免內存泄漏。
Backbone.js on
vs listenTo
var view = Backbone.View.extend({
events: {
"click": "onClick"
},
initialize: function(){
// this will be removed automatically when the view is `remove`d,
// avoiding memory leaks.
this.listenTo(App.actionsChannel, 'action:triggered', this.onActionTriggered);
},
onClick: function(e) {
},
onActionTriggered: function(actionName) {
//do some ajax requests
},
});
上面的代碼片段都只是去傾聽一個事件的例子。在需要的地方使用trigger
,以及它在何處有意義。
我只在一個地方使用'on'函數。我有兩個視圖,一個觸發事件,其他的捕獲它在初始化 – kdureidy
我認爲問題是我有殭屍視圖,當路由發生變化時,在當前視圖捕獲事件之前創建的新視圖被破壞 – kdureidy
青睞因爲這個原因,''listenTo'在'on'上。 –