在AngularJS中广播不同的控制器

时间:2015-03-05 17:05:44

标签: angularjs angularjs-scope broadcast angularjs-service

我正在使用看起来像这样的工厂为我的应用程序开发一个权限系统:

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");
    }

}]);

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

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

1 个答案:

答案 0 :(得分:1)

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

因此,当您的视图发生更改并且旧控制器不再相关时,$rootScope仍然具有侦听器,该侦听器仍然通过以下方式保留对旧控制器$scope的引用。关闭,因此一切仍然是老控制器。

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

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

这可以解决您的问题。