About $emit and $broadcast in AngularJS

Angular's $emit, $broadcast and $on is useful for publish an event and subscribe/unsubscribe to it somewhere else.

Using $scope.$emit will fire an event up the $scope. Using $scope.$broadcast will fire an event down the $scope. Using $scope.$on is how we listen for these events.

// firing an event upwards
$scope.$emit('event:name', 'Hello world');

// firing an event downwards
$scope.$broadcast('event:name', {
  msg: 'Hello world!'
});

// listen for the event in the relevant $scope
$scope.$on('event:name', function (event, data) {
  console.log(data); 
});

The key thing to remember when using $scope to fire your events, is that they will communicate only with immediate parent or child scopes only. But there is one way how to send event to sibling scopes

$scope.$parent.$broadcast('event:name', 'Hello world');

The $rootScope object has the identical $emit, $broadcast, $on methods, but they work slightly differently to how $scope implements them. $rootScope.$emit will fire an event for all $rootScope.$on listeners only, $rootScope.$broadcast will notify all $rootScope.$on as well as $scope.$on listeners.

We can subscribe and unsubscribe event easily

app.controller('TestCtrl', function TestCtrl ($scope) {
    // subscribe
    var myListener = $scope.$on('event:name', function (event, data) {
        // do something
    });

    // unsubscribe
    myListener();
});

If you choose to use $emit, one of your other $scope listeners can cancel it, so prevent it bubbling further. Using $broadcast cannot be cancelled!

Cancelling an event which was sent via $emit looks like this:

$scope.$on('event:name', function (event, data) {
    event.stopPropagation();
});
comments powered by Disqus