我想要的是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>
答案 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');
});