angularjs: условная маршрутизация в приложении.конфиг
я столкнулся с проблемой в angular.JS ui-маршрутизатор и не в состоянии разобраться .
вопрос:
Я хочу, чтобы пользователь получил доступ ко всем маршрутам, определенным в config, если пользователь является EnterpriseAdmin, и ограничил некоторые маршруты, если пользователь является корпоративным пользователем.
маршруты определены в 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'
})
может кто-нибудь помочь мне решить эту проблему, потому что в соответствии с моим пониманием приложения.js загружается перед всеми контроллерами . Конечно, я могу проверить контроллер, если пользователь-либо EnterpriseAdmin, либо Enterprise user, но до этого времени все маршруты уже настроены и пользователь имеет к ним доступ.
есть ли способ, которым я могу сделать вызов ajax в блоке config, а затем определить глобальную переменную, а затем, проверив ее, я могу настроить некоторые маршруты или нет ??
любая помощь будет оценили С уважением
1 ответов
$stateProvider.состояние имеет свойство данных. Один из способов-добавить опцию auth в ваши состояния.
$stateProvider.state('Registration.Instructors', {
url: "/Instructors",
templateUrl: '/Scripts/App/Instructors/Templates/instructors.html',
controller: 'InstructorController',
data: { auth: "EnterpriseAdmin"}
})
затем вы можете прослушать событие, запущенное ui-маршрутизатором, прежде чем любое состояние начнет загрузку и предотвратить его, если пользователь неавторизован:
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;
}
})
});
вы даже можете перенаправить его в другое состояние, основываясь на вашей логике пользовательского интерфейса:
$state.transitionTo('login');