$ rootScope。$向所有控制器发出广播吗?

时间:2015-08-11 17:05:16

标签: javascript angularjs

我正在使用$rootScope.$emit()$rootScope.$on()在我的Angular应用中广播和收听状态更改。

在某些情况下,多个控制器都可以发出和侦听相同的事件。如果我在同一个控制器中有以下代码,那么该控制器在发出事件时运行其.$on代码,或者该事件是否只向其他控制器广播?

$rootScope.$emit('adminChanged');
...
$rootScope.$on('adminChanged', function() {
  getCustomerInfo();
});

3 个答案:

答案 0 :(得分:9)

请参阅angular docs获取答案:(强调我的)

On $ emit:

  

$ emit(name,args);   通过范围层次结构向上调度事件名称,通知已注册的$ rootScope.Scope侦听器。

     

事件生命周期从调用$ emit的范围开始。所有侦听此范围上的name事件的侦听器都会收到通知。之后,事件向上遍历根范围并沿途调用所有已注册的侦听器。如果其中一个侦听器取消它,该事件将停止传播。

On $ broadcast:

  

$ broadcast(name,args);   向下调度事件名称到所有子范围(及其子级),通知已注册的$ rootScope.Scope侦听器。

     

事件生命周期从调用$ broadcast的范围开始。所有侦听此范围上的name事件的侦听器都会收到通知。然后,事件将传播到当前作用域的所有直接和间接作用域,并在此过程中调用所有已注册的侦听器。该活动无法取消。

(另外,请注意关于使用哪一个的评论!)

答案 1 :(得分:1)

$scope.$emit up, $scope.$broadcast down

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. A quick example:

// firing an event upwards
$scope.$emit('myCustomEvent', 'Data to send');

// firing an event downwards
$scope.$broadcast('myCustomEvent', {
  someProp: 'Sending you an Object!' // send whatever you want
});

// listen for the event in the relevant $scope
$scope.$on('myCustomEvent', function (event, data) {
  console.log(data); // 'Data to send'
});

We could fire an event down from ParentCtrl to SiblingOneCtrl using $broadcast:

app.controller('ParentCtrl',
  function ParentCtrl ($scope) {

  $scope.$broadcast('parent', 'Some data'); // going down!

});

app.controller('SiblingOneCtrl',
  function SiblingOneCtrl ($scope) {

  $scope.$on('parent', function (event, data) {
    console.log(data); // 'Some data'
  });

});

答案 2 :(得分:-1)

$ rootScope。$ on作为一个等待事件的监听器,而$ rootScope。$ emit创建一个事件,所以你想在$ rootScope。$ emit之前放置$ rootScope。$,这样听众就可以抓住事件