Angularjs $broadcast once, $on twice
Asked Answered
B

4

20

It sends $broadcast once from the rootScope, but the listener ($on) gets called twice.

The listener is in a controller and it uses $rootScope.$on instead of $scope.$on. Has someone had this problem?

edit

rootScope:

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

other Controller:

$rootScope.$on('menuActivateActionPublish', function(event) {});
Bluebill answered 21/6, 2015 at 20:19 Comment(4)
you should provide your codeAcima
Maybe you have two controllers?Gastrocnemius
Probably you have to remove the listener when the controller is destroyed. I'd even register the listener in the .run phase and not in the controller - to avoid auch problems the controller should only register listener on is own scopeVary
Possible duplicate of AngularJs broadcast repeating execution too many timesBay
S
31

Since you register your $on listener on $rootScope, it doesn't get destroyed with the controller and next time you init the controller it gets created again.

You should create your listener on controller scope

$scope.$on('menuActivateActionPublish', function(event) {});
Semiaquatic answered 23/6, 2015 at 8:13 Comment(4)
Hey in my case on listen called incrementally.Weakfish
@UmairKhanzada sorry I dont understand that commentSemiaquatic
listen $rootScope.$broadcast('xyz'); event when user login and when user logout and login again it'll be listen incrementally. listen function $rootScope.$on('xyz', function(){ console.log('running')});Weakfish
It depends on where do you have $broadcast and $on . In your case, you should have $broadcast() in function that handles login - wherever you determine that user is logged in, and $on() only in single place. For example app.run(). That is if you want to use $rootScope. If you want to use it in controllers or other "modules" then use $scope.$on() and as many times you want, because it gets destroyedSemiaquatic
F
10

Be careful you avoid two instances of the controller means two event listeners, which means the method gets executed twice !! ( example: using twice 'ng-controller' )

Footloose answered 28/9, 2017 at 8:30 Comment(0)
M
5

To complement que1326 answer, as an example, if you are using ui-router and have something like

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

and in yourPage.html you have a ng-controller="YourController as Ctrl", then you are creating 2 instances of the controller: 1 instance is created by the state configuration and another one in your html.

Musick answered 31/10, 2017 at 13:50 Comment(0)
T
0

The only solution I could get to work was to create the listener inside the $viewContentLoaded event:

$scope.$on('$viewContentLoaded', function() {
  //Put your listener(s) in here
  $scope.$on('menuActivateActionPublish', function(event) {});
});
Thanksgiving answered 27/3, 2018 at 17:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.