我正在使用看起来像这样的工厂为我的应用程序开发一个权限系统:
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");
}
}]);
它正在工作,但如果我更改控制器并执行相同操作(更改视图并更改控制器),则广播将到达旧控制器。
有谁知道为什么?或者如何解决它?
答案 0 :(得分:1)
您正在$rootScope
上定义您的事件监听器。顾名思义,只有一个$rootScope
,它位于文档的根部。
因此,当您的视图发生更改并且旧控制器不再相关时,$rootScope
仍然具有侦听器,该侦听器仍然通过以下方式保留对旧控制器$scope
的引用。关闭,因此一切仍然是老控制器。
相反,您应该在控制器的$scope
上定义侦听器:
$scope.$on('permissionsReady', function(event, ready) {
$scope.initialize();
});
这可以解决您的问题。