我有以下设置:
stApp.controller('AdminTableController', ['$rootScope', '$scope', 'gridService',
function ($rootScope, $scope, gridService) {
$scope.$watch('tableData.$pristine', function (newValue) {
$rootScope.broadcast("tableDataUpdated", {
state: page.$pristine
});
});
}])
stApp.controller('AdminGridController', ['$rootScope', '$scope', 'gridService',
function ($rootScope, $scope, gridService) {
$rootScope.on("tableDataUpdated", function (args) {
//args.state would have the state.
alert(args.state);
});
}])
当我运行此代码时,我收到一条消息:
Object #<Object> has no method 'on'
请注意,我尝试使用$ rootScope.on和$ scope.on
答案 0 :(得分:21)
您的意思是$broadcast
和$on
(而不是broadcast
和on
),即:
$rootScope.$broadcast("tableDataUpdated", { state: page.$pristine });
// ...
$rootScope.$on("tableDataUpdated", function (args) {
// ...
值得注意的是$broadcast
用于将事件委托给子或兄弟范围,而$emit
会将事件向上传播到范围的父母,因此;
选择$broadcast
(而不是$emit
)时,应该注入根范围以绑定$on
(正如你很好地做)或调用$on
在接收者的孤立范围内,无论是调度员的子女范围。
有关$emit
和$broadcast
的详细说明,请参见this post。
答案 1 :(得分:6)
如果事件监听器位于子范围:$scope.$broadcast('MyEvent', args);
如果事件监听器位于父范围:$scope.$emit('MyEvent', args);
您可以通过在$ rootScope上使用$ broadcast来避免任何混淆,因为$ rootScope是Angular应用程序中所有范围的父级:$rootScope.$broadcast('MyEvent', args);
无论您使用$ emit还是$ broadcast,接收控制器都会使用$scope.$on('MyEvent', function() {});
答案 2 :(得分:2)
$rootScope.on("tableDataUpdated", function (args) {
//args.state would have the state.
alert(args.state);
});
应该是
$rootScope.$on("tableDataUpdated", function (args) {
//args.state would have the state.
alert(args.state);
});
答案 3 :(得分:0)
$scope.$emit('MyEvent', args);
来自第一个控制器,并在第二个控制器中接收:
$scope.$on('MyEvent', function() {});