我有两个控制器,并尝试使用控制器 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
事件观察程序产生两个参数;event
和data
:
̶$̶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>