Angular - трансляция, $on вызывается несколько раз в директиве

Я работаю над одностраничным приложением с angular, и мне нужно общаться между двумя разными директивами, которые в основном не имеют родительского дочернего отношения.

В Директиве А у меня есть 2 места, где мне нужно транслировать одно и то же событие из разных функций. И в Директиве B для этого написали $on listener.

Теперь я замечаю, что всякий раз, когда callFirstFunc и его трансляция вызываются в первый раз, слушатель будет вызываться один раз. При последующем вызове прослушиватель вызывается дважды, трижды и т. д., и он продолжает увеличиваться.

callSecondFunc вызывается, когда callFirstFunc был выполнен, поэтому прослушиватель для этого также вызывается как многие no. раз прослушиватель для трансляции в callFirstFunc. Итак, почему слушатель вызывается не только один раз, а несколько раз? Он зацикливается и увеличивается каждый раз.

Директива А:

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");
            }
        }
    };
});

Директива Б:

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
               }                    
            }
        };
    });

person whyAto8    schedule 06.11.2014    source источник
comment
Возможный дубликат трансляции AngularJ, повторяющей выполнение слишком много раз   -  person kinkajou    schedule 18.01.2017


Ответы (2)


Я думаю, вы забыли отвязать четный обработчик.

Вы можете сделать это следующим образом:

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

person Rabi    schedule 06.11.2014
comment
Раби - я пробовал, но все равно. Его прослушивание не раз и продолжает увеличиваться. - person whyAto8; 06.11.2014

Этот код работает для меня:

$rootScope.$$listeners.nameOfYourEvent.length = 1;
person Walter White    schedule 04.02.2019