Angular $ routeProvider基于用户角色

时间:2013-10-28 10:43:50

标签: angularjs angular-routing

我想根据用户的角色在我的角度应用程序中注册路由,我可以这样做:

angular.module('myModule', [])
    .config(function($routeProvider, $http){
        $routeProvider.when('/home',{
           templateUrl: '/home.html',
           controller: 'HomeCtrl'
        });
        $http.get('/user')
            .success(function(user){
                if (user.admin){
                    $routeProvider.when('/dashboard, {
                        templateUrl: '/dashboard.html',
                        controller: 'DashboardCtrl'
                    });
                }
            });
    });

但在config方法中,我无法使用$http服务,我该如何实现呢?

2 个答案:

答案 0 :(得分:5)

结帐ui-router。对于Angular来说,它是一个功能更丰富的基于状态的路由系统。它通过允许您在状态更改时发出模型请求来解决您的问题,并返回一个承诺,以便在您获得模型时,您可以继续或更改状态。

答案 1 :(得分:0)

我遇到了同样的问题。 有我的解决方案:

'use strict';

angular.module('theAppName')
    .config(function ($routeProvider) {
        $routeProvider
          .when('/check', { // the role has to be 'not_confirmed'
            templateUrl: 'app/account/check/check.html', 
            controller: 'CheckCtrl'
            });
    })

.run(function ($rootScope, $location, Auth) {
    // Redirect to '/' if the role is not 'not_confirmed'
    $rootScope.$on('$routeChangeStart', function (event, next) {
      Auth.getUserRoleInAsync(function(role) {
        if (next.$$route.originalPath === '/check' && role !== 'not_confirmed') {
          $location.path('/');
        }
      });
    });
  });

如果您不准确测试路线,将测试所有路线。所以你需要使用next.$$route.originalPath

在Auth服务文件中:

  getUserRoleInAsync: function(cb) {
    if(currentUser.hasOwnProperty('$promise')) {
      currentUser.$promise.then(function(data) {
        cb(data.role);
      }).catch(function() {
        cb(false);
      });
    } else {
      cb(false);
    }
  },

我正在等待一些反馈。