7

我正在开发一个带有角度的单页应用程序,我需要在两个不同的指令之间进行通信,这些指令基本上没有父子关系。

在指令 A 中,我有 2 个地方需要从不同的功能广播相同的事件。在指令 B 中,为此编写了一个 $on 监听器。

现在,我观察到只要 callFirstFunc 及其广播第一次被调用,监听器就会被调用一次。在随后的调用中,监听器被调用两次,三次等等,它不断增加。

callSecondFunc 在 callFirstFunc 被执行时被调用,所以这个监听器也被称为尽可能多的 no。callFirstFunc 中广播的监听器次数。那么,为什么监听器不是只调用一次,为什么是多次呢?它每次都在循环和增加。

指令 A:

app.directive("firstDir", function ($rootScope) {
    return {
        restrict: 'E',
        link: function (scope, element, attrs) {
            // some other code
            callFirstFunc();
            var callFirstFunc = function(){
                // some other code
                $rootScope.$broadcast("someEvent");
            }
            callSecondFunc();
            var callSecondFunc = function(){
                // some other code
                $rootScope.$broadcast("someEvent");
            }
        }
    };
});

指令 B:

app.directive("secondDir", function ($rootScope) {
        return {
            restrict: 'E',
            link: function (scope, element, attrs) {
                // some other code
                scope.$on("someEvent", function(){
                    detectSTuff();
                }) 
               function detectStuff(){
                  // other code
               }                    
            }
        };
    });
4

2 回答 2

1

我认为您忘记取消绑定偶数处理程序。

你可以这样做 -

var someEventHandle = scope.$on("someEvent", function(){
                    detectSTuff();
                });
scope.$on('$destroy', someEventHandle);

于 2014-11-06T10:05:06.473 回答
0

这段代码对我有用:

$rootScope.$$listeners.nameOfYourEvent.length = 1;
于 2019-02-04T15:42:27.177 回答