0

How to stop broadcast event in angularjs? I have three controllers nested. When I broadcast an event from ctrl1 controller, ctrl2 and ctrl3 controllers listen to this event. I want to stop ctrl3 controller from listener event. How to do this?

<div  ng-controller="ctrl1" ng-click="ad2()">
        <div  ng-controller="ctrl2">
            <div  ng-controller="ctrl3">
            </div>  
        </div>  
    </div>  

    studentReport.controller("ctrl1",["$scope",function($scope){
    $scope.ad2 = function(){
        $scope.$broadcast("text","hi");
    }
}])

studentReport.controller("ctrl2",["$scope",function($scope){
    $scope.$on("text",function(event,message){
        alert(message)
    });
}])

studentReport.controller("ctrl3",["$scope",function($scope){
    $scope.$on("text",function(event,message){
        alert(message)
    });
}])
bhovhannes
  • 5,511
  • 2
  • 27
  • 37
bharath
  • 845
  • 2
  • 11
  • 23

3 Answers3

1

$scope.on returns a function you can use to deregister the event. So you can do something like this:

var deregisterKey = $scope.on('key', fn);

// stop listening
deregisterKey()

See also: https://stackoverflow.com/a/14898795/3891533

Community
  • 1
  • 1
Dieterg
  • 16,118
  • 3
  • 30
  • 49
1
// subscribes...
  var myListener = $scope.$on('child', function (event, data) {
    // do something
  });

  // unsubscribes...
  // this would probably sit in a callback or something
  myListener();

To unsubscribe listening event.

Ashish Kumawat
  • 685
  • 7
  • 22
0

Before you call alert(message) try setting this...

 event.defaultPrevented = true; 

Broadcast does not have the stopPropagation method thats why you have to use defaultPrevented

Trevor
  • 7,777
  • 6
  • 31
  • 50