如何在AngularJS中从一个控制器向另一个控制器发送消息?

时间:2013-07-21 18:05:15

标签: javascript angularjs

我有以下设置:

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

4 个答案:

答案 0 :(得分:21)

您的意思是$broadcast$on(而不是broadcaston),即:

$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() {});