在 AngularJS 中广播不同的控制器

Broadcast different controllers in AngularJS

我正在使用如下所示的工厂为我的应用程序开发权限系统:

angular.module('ecosystemServices', [])
.factory('Guard', function($http, $rootScope) {
    var permissions = [];
    return {

        ready: function() {
            if (permissions.length == 0) {
                $http.get('/api/users/own-permissions')
                    .success(function(data){
                        permissions = data.user_permissions;
                        $rootScope.$broadcast('permissionsReady', 1);
                });
            } else {
                $rootScope.$broadcast('permissionsReady', 1);
            }

            return true;
        }
    }
})

我必须等到权限加载后才能开始查询,所以我正在向控制器执行广播,看起来像这样:

appControllers.controller('AgencyPanelCtrl', ['$rootScope', '$scope', '$location', '$routeParams', '$http','Guard',
function ($rootScope, $scope, $location, $routeParams, $http, Guard) {

    $scope.loading = true;


    Guard.ready();

    $scope.has_permission = function(permission) {
        return Guard.can(permission);
    }

    $rootScope.$on('permissionsReady', function(event, ready) {
        $scope.initialize();
    });


    $scope.initialize = function() {
        console.log("Initialized");
    }

}]);

它工作正常,但如果我更改控制器并执行相同操作(更改视图并更改控制器),广播将到达旧控制器。

有谁知道为什么?或者如何解决?

您正在 $rootScope 上定义事件侦听器。顾名思义,只有一个 $rootScope,它位于文档的根部。

因此,当您的视图发生变化并且旧控制器不再相关时,$rootScope 仍然有侦听器,它仍然通过闭包持有对旧控制器 $scope 的引用,因此,一切仍归旧控制器所有。

相反,您应该在控制器的 $scope 上定义侦听器:

$scope.$on('permissionsReady', function(event, ready) {
    $scope.initialize();
});

这应该可以解决您的问题。