如何在 AngularJS 中的两个控制器之间广播事件



我有两个控制器,并尝试使用控制器 A 的以下代码发送事件:

$scope.$watch("showContextFooter", function (newValue, oldValue) {
$rootScope.$broadcast('contextFooterChange', {isOpen: $scope.showContextFooter});
});

在控制器 B 中,我试图通过以下方式捕获此事件:

$rootScope.$on('contextFooterChange', function(data){
$log.info(data);
});
//OR
$scope.$on("$destroy",$scope.$on("contextFooterChange", function (e) {
$log.info(e);
}));

但在控制器 B 中没有收到任何事件。 我尝试调试并看到控制器 A 广播,但控制器 B 中没有任何反应。有人可以给我提示吗?

尝试

$scope.$on('contextFooterChange', function(data){
$log.info(data);
});

$rootScope.$broadcast将事件发送到子范围,因此需要在$scope级别进行捕获。

如果您想进入$rootScope级别,请使用$rootScope.$emit而不是$rootScope.$broadcast(由于性能提升,我强烈建议这样做(

$on事件观察程序产生两个参数;eventdata

̶$̶r̶o̶o̶t̶S̶c̶o̶p̶e̶.̶$̶o̶n̶(̶'̶c̶o̶n̶t̶e̶x̶t̶F̶o̶o̶t̶e̶r̶C̶h̶a̶n̶g̶e̶'̶,̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶(̶d̶a̶t̶a̶)̶{̶  
$scope.$on('contextFooterChange', function(event,data){
$log.info(data);
});

此外,最好将$on观察器放在$scope上,然后当其$scope被销毁时,它将自动销毁。

演示

angular.module("app",[])
.controller("ctrlA", function($scope) {
$scope.$watch("showContextFooter", function (newValue, oldValue) {
$scope.$root.$broadcast('contextFooterChange', {isOpen: $scope.showContextFooter});
});
})
.controller("ctrlB", function($scope,$log) {
$scope.$on('contextFooterChange', function(event,data){
$scope.message = data;
$log.info(data);
});
})
<script src="//unpkg.com/angular/angular.js"></script>
<body ng-app="app">
<div ng-controller="ctrlA">
<input type="checkbox" ng-model="showContextFooter">showContextFooter<br>
</div>
<div ng-controller="ctrlB">
message={{message}}
</div>
</body>

最新更新