53

私の Angular コントローラーの 1 つの内部には、次のようなものがあります。

// controller A
$rootScope.$on("myEventFire", function(event, reload) {
    someAction();
});

別のコントローラーでは、これがあります:

// controller B
$scope.openList = function(page) {
    $rootScope.$broadcast('myEventFire', 1);
}

さて、これは単一ページのアプリです。最初にコントローラー A に移動してこのイベントをトリガーしようとすると、someAction()が 1 回実行されます。離れてコントローラー A に戻って同じことをすると、someAction()が 2 回実行されます。もう一度やると、それが 3 回発生します。ここで何が間違っていますか?

4

5 に答える 5

27

$rootScope.$on() から return コールバックを実行することにより、スコープが破棄されたときにそれを削除することもできます。

いえ

var destroyFoo;

destroyFoo = $rootScope.$on('foo', function() {});

$scope.$on('$destroy', function() {
  destroyFoo(); // remove listener.
});       
于 2014-06-19T20:42:21.383 に答える
9

壊したくないなら、

最初にリスナーイベントを確認できると思います-AngularJS 1.2.15

リスナー イベントの確認 - 例

だから私はこれがうまくいくと思う:

if(!$rootScope.$$listenerCount['myEventFire']){
    $rootScope.$on("myEventFire", function(event, reload) {
        someAction();
    });
}
于 2016-06-29T06:15:16.930 に答える
3

それが誰かを助けるなら、私はディレクティブで同様の問題を抱えていました。ディレクティブを開くたびに、イベントが発生する回数が増加しました。

以下を使用して解決しました(これはコントローラーのinit関数にありましたが、コントローラー自体で定義できたと思います。私の場合、イベントが発生したときにコントローラーを再初期化する必要がありました)

 if (!$scope.onMyEvent) $scope.onMyEvent= $scope.$on('myEvent',function(event,data){
        .....
        });
于 2017-08-16T09:32:30.943 に答える
1

私の場合は...

if ($rootScope.$$listenerCount['myEventFire']) {
    $rootScope.$$listeners.broadcastShowMessageError = [];
};

$rootScope.$on('myEventFire', function (event, reload) {
    someAction();
})
于 2017-01-11T10:28:58.417 に答える