尝试使用Angular rootScope在控制器之间保留数据,但始终未定义

时间:2015-02-16 17:22:44

标签: javascript angularjs angularjs-scope angularjs-service angularjs-routing

我有一个管理员登录页面。当用户以管理员身份成功登录时,我希望显示用户访问的所有页面的顶部:

<!-- 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解决方案根本不起作用?

。”

3 个答案:

答案 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;
])