Using $scope.$emit will fire an event name upwards through the scope hierarchy and notify to the $scope.The event life cycle starts at the scope on which $emit was called.
Working wireframe :
Using $scope.$broadcast will fire an event down the $scope. We can listen of these events using $scope.$on Working wireframe :
Instead of $scope you can use $rootScope, in that case your event will be available in all the controllers regardless of that controllers scope
Clean registered event in AngularJS
The reason to clean the registered events because even the controller has been destroyed the handling of registered event are still alive. So the code will run as unexpected for sure.
Always deregister $rootScope.$on listeners on the scope $destory event
$rootScope.$on listeners will remain in memory if you navigate to another controller. This will create a memory leak if the controller falls out of scope.