我正在构建一个Backbone.js应用程序,我使用BackboneJS无线电进行消息传递。
首先,我创建了一个频道:
App.actionsChannel = Backbone.Radio.channel('actions');
当我点击一个动作按钮,让我们说‘下一步’动作按钮:
App.actionsChannel.trigger('action:triggered', 'next');
我处理这件事:
App.actionsChannel.on('action:triggered', function(actionName){
//do some ajax requests
});
问题是,当我第一次单击next按钮时,它触发next
动作一次,第二次触发两次,第三次触发4次,以此类推……
每次我触发下一个动作时,它都会触发很多次,而不是一次。当我检查actionsChannel._events
时,我发现它包含了我触发的所有操作。
发布于 2016-09-26 21:05:58
这是因为注册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
来避免内存泄漏。
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
,在有意义的地方使用它。
https://stackoverflow.com/questions/39697760
复制相似问题