web-dev-qa-db-ja.com

Angularjs $ broadcast 1回、$ on 2回

RootScopeから$ broadcastを1回送信しますが、リスナー($ on)は2回呼び出されます。

リスナーはコントローラー内にあり、$rootScope.$onではなく$scope.$onを使用します。誰かがこの問題を抱えていましたか?

編集

rootScope:

$rootScope.$broadcast('menuActivateAction' + item.event_name_postfix, item.event_args);

他のコントローラー:

$rootScope.$on('menuActivateActionPublish', function(event) {});
18
Shai M.

$ onScopeに$ onリスナーを登録するので、コントローラーで破棄されず、次にコントローラーを初期化したときに再び作成されます。

コントローラースコープでリスナーを作成する必要があります

$scope.$on('menuActivateActionPublish', function(event) {});
27
Tomas

コントローラーの2つのインスタンスが2つのイベントリスナーを意味することを回避するように注意してください。つまり、メソッドが2回実行されます。 (例: 'ng-controller'を2回使用)

7
que1326

たとえば、ui-routerを使用していて、

.state('app.yourpage', {
            url:'yourPage',
            views: {
                'content@': {
                    templateUrl : 'views/yourPage.html',
                    controller  : 'YourController'
                }
            }
        })

yourPage.htmlにはng-controller="YourController as Ctrl"の場合、コントローラの2つのインスタンスを作成しています。1つのインスタンスは状態設定によって作成され、もう1つのインスタンスはHTMLに作成されます。

4
João Otero

私が作業できる唯一の解決策は、$ viewContentLoadedイベント内にリスナーを作成することでした。

$scope.$on('$viewContentLoaded', function() {
  //Put your listener(s) in here
  $scope.$on('menuActivateActionPublish', function(event) {});
});
0
CommandoScorch