首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BackboneJS无线电频道触发事件不止一次

BackboneJS无线电频道触发事件不止一次
EN

Stack Overflow用户
提问于 2016-09-26 08:13:44
回答 1查看 728关注 0票数 2

我正在构建一个Backbone.js应用程序,我使用BackboneJS无线电进行消息传递。

首先,我创建了一个频道:

代码语言:javascript
运行
复制
App.actionsChannel = Backbone.Radio.channel('actions');

当我点击一个动作按钮,让我们说‘下一步’动作按钮:

代码语言:javascript
运行
复制
App.actionsChannel.trigger('action:triggered', 'next');

我处理这件事:

代码语言:javascript
运行
复制
App.actionsChannel.on('action:triggered', function(actionName){
  //do some ajax requests
});

问题是,当我第一次单击next按钮时,它触发next动作一次,第二次触发两次,第三次触发4次,以此类推……

每次我触发下一个动作时,它都会触发很多次,而不是一次。当我检查actionsChannel._events时,我发现它包含了我触发的所有操作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-26 21:05:58

这是因为注册on是多次的,在您的问题中没有显示的地方,而且应该只做一次。

✘不要这么做

代码语言:javascript
运行
复制
var view = Backbone.View.extend({
    events: {
        "click": "onClick"
    },

    onClick: function(e) {
        App.actionsChannel.on('action:triggered', function(actionName) {
            //do some ajax requests
        });
    }
});

✔这样做

代码语言:javascript
运行
复制
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来避免内存泄漏。

listenTo

代码语言:javascript
运行
复制
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,在有意义的地方使用它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39697760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档