4

コントローラーの上に $rootScope.$on コードがあります。このコントローラーをロード/呼び出すたびに、 $rootScope.$on リスナーが増加することに気付きました。つまり、コントローラーにアクセスすると、無期限にリスナーが追加され、追加され、追加されます。

別のコントローラーから $rootScope.$emit を介して呼び出すと、$rootScope.$on 内の関数が単一のエミット/ブロードキャストであっても複数回実行されることに気付きました。

$rootScope.$on('listen', function() {
    $scope.displayString();
});

$scope.displayString = function() {
    console.log('test'); // This display 7 times because I visit the controller 7 times
}

リスナーが既に存在する場合に新しいリスナーを作成しないように、別のリスナーインスタンスを作成しないようにすることは可能ですか?

4

1 に答える 1

9

コントローラーのスコープが破棄されたら、イベント リスナーの登録を解除する必要があります。

この$on関数は、関数が呼び出されたときにリスナーを削除する登録解除関数を返します。

したがって、次のように設定できます。

var deregister = $rootScope.$on('listen', function() {
    $scope.displayString();
});
$scope.$on('$destroy', deregister);

注: これは、コントローラーのスコープが実際に破棄された場合にのみ機能します (たとえば、DOM から削除されたディレクティブや、別のルートに移動した場合など)。それが起こらない場合は、イベント リスナーを 1 回だけ登録する方法を考え出す必要があります。

于 2015-05-29T05:26:19.273 に答える