访问Angularjs中的currentUser

时间:2014-08-18 11:23:47

标签: angularjs

我目前在我的app.js配置中有以下代码,用于安全路由:

var checkLoggedin = function($q, $timeout, $http, $location, $rootScope){
  // Initialize a new promise
  var deferred = $q.defer();

  // Make an AJAX call to check if the user is logged in
  $http.get('/api/loggedin').success(function(user){
    // Authenticated
    if (user !== '0')
      $rootScope.user = user; //IS THIS ADVISABLE???
      $timeout(deferred.resolve, 0);

    // Not Authenticated
    else {
      $timeout(function(){deferred.reject();}, 0);
      $location.url('/login');
    }
  });

  return deferred.promise;
};

后端返回用户对象。

我希望能够从不同的控制器访问当前用户,并想知道我是否应该使用$rootscope(如上所示)或是否Service是可行的方法。

如果服务是前进的方式,那么任何代码示例都将非常受欢迎。

1 个答案:

答案 0 :(得分:0)

如果您只想在视图中使用您的用户变量,那么从rootScope读取就可以了。但是,如果您在控制器中想要将该用户用于某些内容,则无法直接从rootScope中读取该内容,因为该checkLoggedin函数可能尚未设置该变量。

例如,如果您在控制器中有这样的代码

.controller('NavbarCtrl', function ($scope, $rootScope) {
    if ($rootScope.user) {
        // do logged in stuff
    }
    //...

可能会失败,因为promise还没有在rootscope中设置用户变量。

这有点烦人,但为了保证变量总是被设置,需要将它作为一个承诺。所以我会尝试通过服务始终访问登录用户。

.service('PersonService', function ($http) {
        return {
            getCurrentUser: function() {
                return $http.get('/api/person/me', {cache: true});
                // or you can use something similar to your code above
            }
        }
    });

是一个例子。如您所见,我已启用缓存,因此多次调用该函数不会创建对后端的新调用。

然后像这样使用它:

.controller('NavbarCtrl', function ($scope, PersonService) {
    PersonService.getCurrentUser().success(function(user) {
        $scope.user = user;
        // or maybe do something else
        $scope.showButton = user.permissionLevel > 5;
    });
    // .....