这些$ scope事件起诉$ broadcast和$ emit有什么问题?

时间:2014-02-12 20:35:13

标签: javascript angularjs events

我想要的是SubCtrl在加载事件时广播一个事件,表示要获取信息。我希望MainCtrl正在侦听对get事件的调用,并通过广播'set'事件并将其name属性作为参数进行响应。 SubCtrl应该监听set事件,并通过填充自己的范围name属性进行响应。

使用以下代码,MainCtrl收到get个活动,但SubCtrl从未收到set个活动。

脚本

app.controller('MainCtrl', function($scope, $rootScope) {
  $scope.name = 'World';
  $scope.$on('get', function(event) {
    console.log('get event received');
    $rootScope.$broadcast('set', $scope.name);
  })
});

app.controller('SubCtrl', function($scope, $rootScope) {
  $scope.name = '..waiting';
  $rootScope.$broadcast('get');
  $scope.$on('set', function(event, name) {
    console.log('set event received');
    $scope.name = name;
  });
});

标记

<body>
  <p ng-controller="MainCtrl">Hello {{name}}!</p>
  <p ng-controller="SubCtrl">Hello {{name}}!</p>
</body>

2 个答案:

答案 0 :(得分:1)

根据应用的大小,使用$rootScope.$broadcast可能会让人贪婪。 (有关详细信息,请参阅this question。)

如果要在兄弟节点上的控制器之间进行通信,有两种方法:

  • 使用通用父控制器
  • 使用共享服务。

我的团队决定开发一个小型的pub / sub服务来解决类似的问题。如果你想尝试一下,这是我们的angular-pubsub service

答案 1 :(得分:0)

我再次立刻意识到了这个问题。我需要在$on $broadcast事件之前设置get听众。

app.controller('SubCtrl', function($scope, $rootScope) {
  $scope.name = '..waiting';
  $scope.$on('set', function(event, name) {
    console.log('set event received');
    $scope.name = name;
  });
  $rootScope.$broadcast('get');
});