代码之家  ›  专栏  ›  技术社区  ›  SoftTimur

检查是否已设置侦听器

  •  1
  • SoftTimur  · 技术社区  · 6 年前

    我在服务中添加了一个侦听器,如下所示:

    app.service('hostService', ['$rootScope', function ($rootScope) {    
        this.addListener = function () {
            console.log("addListener")
            $rootScope.$on("messageFromSiteToHost", function (event, data) {
                action(data);
            })
        }
    

    然后我意识到 hostService.addListener 因此,当出现以下消息时,用户会多次调用 messageFromSiteToHost , action(data) 被多次调用。

    有人知道有没有办法检查 $rootScope.$on("messageFromSiteToHost" 已设置(未在服务中使用辅助变量)。如果已经设置好了,我不想添加两次侦听器。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Sly_cardinal    6 年前

    框架中没有任何内容可用于检查现有事件侦听器。

    您能解释一下您要求不使用“服务中的辅助变量”的原因吗?

    无法在函数周围添加防护的原因是什么

    app.service('hostService', ['$rootScope', function ($rootScope) {    
    
        var listenerAdded = false;
        this.addListener = function () {
            if (listenerAdded){
                return;
            }
            listenerAdded = true;
    
            console.log("addListener")
            $rootScope.$on("messageFromSiteToHost", function (event, data) {
                action(data);
            })
        }
    
    }]);
    

    此外,如果您发现在整个应用程序中需要经常这样做,那么您可以推广实现或使用类似的方法 lodash.once 要移除样板,请执行以下操作:

    app.service('hostService', ['$rootScope', function ($rootScope) {    
    
        this.addListener = _.once(function () {
            console.log("addListener")
            $rootScope.$on("messageFromSiteToHost", function (event, data) {
                action(data);
            })
        });
    
    }]);