我有一个管理员登录页面。当用户以管理员身份成功登录时,我希望显示用户访问的所有页面的顶部:
<!-- nav bar -->
<div>
<span ng-show="$root.isAdmin">(ADMIN)</span>
</div>
我尝试使用$rootScope
来完成此操作,但我不断获得undefined
:
// controller for logging in
app.controller('AdminLoginCtrl', [ '$rootScope', '$scope', 'stateParams', 'loginService', function($rootScope, $scope, $stateParams, loginService) {
loginService.success(function() {
$rootScope.isAdmin = true;
console.log($rootScope.isAdmin); // returns true
$location.path("/login_success");
});
}]);
// some other controller AFTER user is logged in as admin
app.controller('BlahCtrl', ['$rootScope', '$scope', function($rootScope, $scope) {
console.log($rootScope.isAdmin); // returns 'undefined'
});
还有一些其他类似的主题,但不适用于我:
(我没有注射问题):
$rootscope value undefined in Controller
(我的其他控制器肯定会在登录后被调用,因此应设置$rootScope.isAdmin
):
AngularJS - Cannot access RootScope
(我没有订购问题):
Angular $rootScope.$on Undefined
其他解决方案可以是不根本使用$rootScope
,只需使用服务来保存共享数据。但是如果我有10个以上的控制器,那么在每个控制器中都可以这样做:
app.controller('...', ['$scope', 'checkAdminService', function($scope, checkAdminService) {
$scope.isAdmin = checkAdminService.getIsAdmin()
}]);
然后:
<span ng-show="isAdmin">(ADMIN)</span>
这是可接受的还是更麻烦的?为了完整起见,为什么“$rootScope
解决方案根本不起作用?
答案 0 :(得分:1)
使用$ rootScope确实是一个不好的做法。最好的解决方案是您建议自己创建一个服务,存储您想要在不同控制器之间共享的信息。在多个位置调用此方法没有问题......
为什么不为页面的顶部定义单独的控制器,这是唯一一个验证用户是否为管理员的控制器?页面的另一部分可以是不同控制器的控制器。
此示例将说明如何使用多个控制器,但当然这也可以通过路由器实现。
答案 1 :(得分:1)
如果您使用可在启动时注册并根据需要传递的特殊用途角$rootScope
替换您传递的value
该怎么办?
http://plnkr.co/edit/r6kdouh0BbnYA4DmEcEM?p=preview
angular
.module('app')
.value('userProfile', userProfile);
function userProfile() {
var userProfile = {
isAdmin: false
};
return userProfile;
}
/////////////////
angular
.module('app')
.run(run);
run.$inject = ['userProfile', 'userAuthService'];
function run(userProfile, userAuthService) {
userAuthService.isUserAdmin().then(function(result) { userProfile.isAdmin = result; });
}
答案 2 :(得分:0)
angular.module('yourmodule', [])
.run(['$rootScope', function($rootScope) {
$rootScope.isAdmin = true;
])