在 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();
});
这应该可以解决您的问题。
我正在使用如下所示的工厂为我的应用程序开发权限系统:
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();
});
这应该可以解决您的问题。