angularjs:app.config中的条件路由

时间:2014-01-07 17:40:11

标签: angularjs angular-ui-router

我在angular.js ui-router中遇到了一个问题,无法对其进行排序。

问题:

如果用户是EnterpriseAdmin,我希望用户访问config中定义的所有路由,如果用户是Enterprise用户,我希望限制某些路由。

路由在config:

中定义
 var adocsModule = angular.module('myApp', ['ngResource', 'ngRoute','ui.bootstrap','ui.router', 'ngAnimate']) 
.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {
   $stateProvider.state('Registration', {
        url: "/Registration",
        templateUrl: '/Scripts/App/Registration/Templates/registration.html', controller: 'CoursesController'
    })
    .state('Registration.Instructors', {
         url: "/Instructors",
         templateUrl: '/Scripts/App/Instructors/Templates/instructors.html', controller: 'InstructorController'
    })
    .state('Registration.Courses', {
         url: "/Courses",
         templateUrl: '/Scripts/App/Instructors/Templates/courses.html', controller: 'CoursesController'
    })

有人可以帮我解决这个问题,因为根据我的理解,app.js会在所有控制器之前加载。当然,如果用户是EnterpriseAdmin或Enterprise用户,我可以检查控制器,但到那时为止所有路由都已配置且用户可以访问它们。

有没有办法可以在配置块中进行ajax调用,然后定义一个全局变量然后通过检查它我可以配置一些路由吗?

任何帮助将不胜感激 此致

1 个答案:

答案 0 :(得分:26)

$ stateProvider.state有一个数据属性。一种方法是为您的州添加auth选项。

$stateProvider.state('Registration.Instructors', {
     url: "/Instructors",
     templateUrl: '/Scripts/App/Instructors/Templates/instructors.html', 
     controller: 'InstructorController',
     data: { auth: "EnterpriseAdmin"}
})

然后你可以在任何状态开始加载之前监听由ui-router发出的事件,并在用户未经授权时阻止它:

app.run(function($rootScope, user){
  $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
    if ( toState.data.auth === 'EnterpriseAdmin' && !user.isAdmin() ) {
        event.preventDefault();
        return false;
    }
  })
});

您甚至可以根据您的ui逻辑将他重定向到另一个州:

 $state.transitionTo('login');