【问题标题】: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 将事件传输到父范围。

      【讨论】:

        猜你喜欢
        • 2012-09-11
        • 2013-09-30
        • 1970-01-01
        • 1970-01-01
        • 2015-08-20
        • 2017-12-03
        • 2015-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多