我在angular.js ui-router中遇到了一个问题,无法对其进行排序。
如果用户是EnterpriseAdmin,我希望用户访问config中定义的所有路由,如果用户是Enterprise用户,我希望限制某些路由。
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调用,然后定义一个全局变量然后通过检查它我可以配置一些路由吗?
任何帮助将不胜感激 此致
答案 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');