web-dev-qa-db-ja.com

Angular $ rootScope。$ broadcast()イベントがコントローラーで2回キャッチされました

ボタンクリック時のイベントのブロードキャスト:-

$scope.onButtonClick = function(){
    $rootScope.$broadcast('onButtonClick');
}

そして、別のコントローラでイベントをキャッチする:-

$rootScope.$on('onButtonClick',function(event){
  alert("catched");
  console.log(event);
});

しかし、一度だけ発砲したにもかかわらず、それは二度キャッチしました。何故ですか?

25
Pratibha

結局のところ、htmlでのng-controller宣言と、ui-routerの状態設定の一部として、複数のコントローラーがインスタンス化されました。

解決策は、宣言の1つを削除することです。

41
Chandermani

$rootScopeでイベントをブロードキャストすると、各コントローラー$scopeでイベントをキャッチできます。 IMO $rootScopeでイベントをキャッチしないでください。

$scope.$on('onButtonClick',function(event){
  alert("catched");
  console.log(event);
});

期待どおりに機能することを示す、プランカーショーケースを作成しました。 プランカー

イベントをキャッチする同じコントローラの複数のインスタンスがある可能性があります。 Chandermaniが示唆したようにこれをチェックしてください。

10
Johannes

Angular $rootScope.$broadcast()イベントがコントローラーで2回キャッチされました

$scope.$on('saveCancelLeadInfo', function (event, args) {
    if ($scope.$$listenerCount["saveCancelLeadInfo"] > 1) {
        $scope.$$listenerCount["saveCancelLeadInfo"] = 0;
    }
    your code here
});
4
Shaik Subhani