在AngularJS控制器上广播?

时间:2013-06-26 21:38:55

标签: javascript angularjs broadcast angularjs-scope angularjs-controller

如何在控制器之间广播消息?

以下是我的尝试:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这取决于范围层次结构,因此取决于您在dom中引导Ctrl1和Ctrl2的位置。

说Ctrl1是Ctrl2的父级。 $ broadcast会将事件传输到子范围:在这种情况下,Ctrl2会注意到它(使用$ on)。

如果您需要将事件从Ctrl2传输到Ctrl1,请使用$ emit将事件传输到父范围。