7

私は角度のある単一ページアプリに取り組んでおり、基本的に親子関係を持たない2つの異なるディレクティブ間で通信する必要があります。

ディレクティブ A には、異なる関数から同じイベントをブロードキャストする必要がある場所が 2 つあります。ディレクティブ B では、そのための $on リスナーを作成しました。

ここで、callFirstFunc とそのブロードキャストが初めて呼び出されるたびに、リスナーが 1 回呼び出されることを確認します。その後の呼び出しで、リスナーは 2 回、3 回と呼び出され、増加し続けます。

callFirstFunc が実行されたときに callSecondFunc が呼び出されるため、これに対するリスナーも何度も呼び出されます。callFirstFunc でのブロードキャストのリスナーの回数。では、リスナーが 1 回だけではなく、複数回呼び出されるのはなぜでしょうか。毎回ループして増えています。

ディレクティブ 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 に答える