角色检查在提供模板之前对用户进行身份验证

时间:2014-06-04 12:01:00

标签: javascript angularjs asynchronous

当路线改变时,我尝试访问/设置

 .when('/settings', {
    templateUrl: 'partials/settings',
    controller: 'SettingsCtrl',
    authenticate: true
  })

.run(function ($rootScope, $location, Auth) {
  $rootScope.$on('$routeChangeStart', function (event, next) {
    Auth.checkUser();
    if (next.authenticate && !Auth.isLoggedIn()) {
       $location.path('/login');
    }
  });

代码调用Auth.checkUser()(Asynch),然后调用!Auth.isLoggedIn()。问题是我需要等待Auth.checkUser(),这会给我正确的用户状态,或者在提供模板之前找到检查响应的方法。

 checkUser: function(user, callback) {
    var cb = callback || angular.noop;    
    return User.check(user,
      function(user) {
        $rootScope.currentUser = user.id;
        return cb(user);
      },
      function(err) {
        return cb(err);
      }).$promise;
  },

  isLoggedIn: function() {
    var user = $rootScope.currentUser;
    return !!user;
  }

1 个答案:

答案 0 :(得分:0)

您应该使用angularjs控制器的resolve机制。这样,您可以在渲染之前定义控制器的任何先决条件(服务注入,等待承诺等)。

示例:

.when('/settings', {
    templateUrl: 'partials/settings',
    controller: 'SettingsCtrl',
    authenticate: true,
    resolve: {
        isUserLogged: ['yourservice' , function(yourservice) {
            return yourservice.isUserLoggedPromise();
        }]
    }
  })

只有在isUserLoggedPromise解析之后才会呈现您的屏幕

相关问题