web-dev-qa-db-fra.com

Angularjs $ diffusé une fois, $ deux fois

Il envoie $ broadcast une fois à partir de rootScope, mais l'auditeur ($ on) est appelé deux fois.

L'écouteur est dans un contrôleur et utilise $rootScope.$on au lieu de $scope.$on. Quelqu'un a-t-il eu ce problème?

modifier

rootScope:

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

autre contrôleur:

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

Puisque vous enregistrez votre écouteur $ on sur $ rootScope, il ne sera pas détruit par le contrôleur et la prochaine fois que vous l'initialiserez, il sera créé à nouveau. 

Vous devez créer votre auditeur sur la portée du contrôleur

$scope.$on('menuActivateActionPublish', function(event) {});
21
Tom

Veillez à éviter deux instances du contrôleur, cela signifie deux écouteurs d'événement, ce qui signifie que la méthode est exécutée deux fois! (exemple: utiliser deux fois 'ng-controller')

7
que1326

Pour compléter la réponse que1326, par exemple, si vous utilisez ui-router et que vous avez quelque chose comme:

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

et dans yourPage.html vous avez un ng-controller="YourController as Ctrl", vous créez alors 2 instances du contrôleur: 1 instance est créée par la configuration de l’état et une autre dans votre code HTML.

4
João Otero

La seule solution que je pouvais mettre au travail consistait à créer le programme d'écoute à l'intérieur de l'événement $ viewContentLoaded:

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