角 - 广播,$在指令中多次调用

问题描述 投票:6回答:2

我工作的一个单页的应用程序,具有角和我有需要,基本上没有父子关系的2个不同的指令之间进行通信。

在指令中,我有2个地方,我需要从不同的功能广播同一事件。而在指令B,都写在监听一个$。

现在,我观察到,每当callFirstFunc和它的广播被称为首次,听者就会被调用一次。在随后的通话,监听器被调用两次,三次等,它不断增加。

当callFirstFunc已执行的callSecondFunc被调用,所以这个听者也被称为多无。时代的听众在广播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");
            }
        }
    };
});

指令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
               }                    
            }
        };
    });
angularjs angularjs-directive angularjs-scope angular-broadcast
2个回答
1
投票

我想你忘了取消绑定事件处理程序。

你可以像下面 -

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

0
投票

此代码的工作对我来说:

$rootScope.$$listeners.nameOfYourEvent.length = 1;
© www.soinside.com 2019 - 2024. All rights reserved.