【问题标题】:Broadcasting across AngularJS controllers?跨 AngularJS 控制器广播?
【发布时间】:2013-06-26 21:38:54
【问题描述】:
如何在控制器之间广播消息?
这是我尝试过的:
function Ctrl1($scope) {
$scope.$broadcast('Update');
}
Ctrl1.$inject = ['$scope'];
function Ctrl2($scope) {
$scope.updated = false;
$scope.$on('Update', function () {
$scope.updated = true;
});
}
Ctrl2.$inject = ['$scope'];
要查看它的运行情况:view the Plnkr。
【问题讨论】:
标签:
javascript
angularjs
broadcast
angularjs-scope
angularjs-controller
【解决方案1】:
而不是使用$broadcast() 共享服务和$watch() 可能是更好的选择。
var myApp = angular.module('myApp', []);
myApp.factory("MyService", function () {
return {
updated: false
};
});
function Ctrl1($scope, MyService, $timeout) {
$timeout(function () { //Some work occurs and sets updated to true
MyService.updated = true;
}, 1000)
}
Ctrl1.$inject = ['$scope', "MyService", "$timeout"];
function Ctrl2($scope, MyService) {
$scope.$watch(function () {
return MyService.updated;
}, function (oldValue, newValue) {
$scope.updated = MyService.updated;
});
}
Ctrl2.$inject = ['$scope', "MyService"];
Updated Plnkr
【解决方案2】:
这取决于作用域层次结构,因此取决于您在 dom 中引导 Ctrl1 和 Ctrl2 的位置。
假设 Ctrl1 是 Ctrl2 的父级。 $broadcast 会将事件传输到子作用域:在这种情况下 Ctrl2 会注意到它(使用 $on)。
如果您需要将事件从 Ctrl2 传输到 Ctrl1,请使用 $emit 将事件传输到父范围。