Inside one of my Angular controllers, I have this:
// controller A
$rootScope.$on(\"myEventFire\", function(event, reload) {
someAction();
});
For my case...
if ($rootScope.$$listenerCount['myEventFire']) {
$rootScope.$$listeners.broadcastShowMessageError = [];
};
$rootScope.$on('myEventFire', function (event, reload) {
someAction();
})
if you don't want to destroy,
I think we can check the listener event first - AngularJS 1.2.15
So I think this should work :
if(!$rootScope.$$listenerCount['myEventFire']){
$rootScope.$on("myEventFire", function(event, reload) {
someAction();
});
}
If it helps anyone I had a similar issue in a directive. Each time the directive opened the number of times the event was fired increased.
I solved it by using the following (this was in my controllers init function but I guess it could have been defined in the controller itself. In my case my controller needed to reinitialise when the event fired)
if (!$scope.onMyEvent) $scope.onMyEvent= $scope.$on('myEvent',function(event,data){
.....
});
Can you try just using $scope.$on()
? Every time controller A is created, it is adding a new listener on the root scope, and that doesn't get destroyed when you navigate away and back. If you do it on the controller's local scope, the listener should get removed when you navigate away and your scope gets destroyed.
// controller A
$scope.$on("myEventFire", function(event, reload) {
someAction();
});
$broadcast
sends the event downward to all child scopes so it should be picked up on your local scope. $emit
works the other way bubbling up towards the root scope.
you can also remove it when the scope is destroyed, by running the return callback from the $rootScope.$on().
I.e.
var destroyFoo;
destroyFoo = $rootScope.$on('foo', function() {});
$scope.$on('$destroy', function() {
destroyFoo(); // remove listener.
});