Я пытаюсь внедрить проверку подлинности пользователя и систему проверки доступа в своем приложении, однако я продолжаю бить блокпосты. Я думаю, что на этот раз у меня есть правильный путь, но у меня есть последнее препятствие.
Немного фона: я попытался поместить весь код в $rootScope.on($ startChangeStart), и это сработало, ужасно... но это сработало. Маршрут всегда перенаправлялся, но из-за проверки подлинности на бэкэнд он отображал первую страницу запроса на 1/2 секунды, а затем страницу перенаправления каждый раз. Таким образом, я попытался "приостановить" загрузку страницы, вызвав evt.preventDefault() прямо в начале функции $startChangeStart, которая работала, но попытка вернуть пользователя обратно к исходному маршруту впоследствии вызвала бесконечный цикл в маршрутизаторе.
Итак, после большего количества исследований и чтения много сообщений о стеках я уверен, что "разрешить:" - это правильное место, чтобы поставить проверку подлинности, чтобы гарантировать, что страница не загружается во время ее возникновения, а затем перенаправляет пользователя, если это необходимо из $startChangeStart. ($ state и event всегда undefined в моих попытках внедрить их в функцию разрешения). Кажется, что выигрышная комбинация.
Моя проблема: у меня есть решение в корневом состоянии в моем приложении: "main"
Это было во избежание избыточности кода, однако я не могу определить, как получить доступ к свойствам состояния корня и, следовательно, результат разрешения, из функции $stateChangeStart. ToState - это дочернее состояние, а fromState - либо предыдущее состояние, либо абстрактное состояние с маршрутом "^"...
Должен ли я установить разрешение для каждого дочернего состояния для этого, или есть способ получить доступ к корневому состоянию с этой точки?
Базовая установка приложения:
angular.module('App', ['ui.router', 'ui.bootstrap', 'ui.event', 'AngularGM', 'ngResource'])
.config(['$urlRouterProvider', '$stateProvider', function($urlRouterProvider, $stateProvider){
$urlRouterProvider
.when('/home', '/')
.when('', '/')
.when('/sign-up/joe', '/sign-up')
.otherwise('/');
$stateProvider
.state('main', {
url: '',
abstract: true,
templateUrl: 'views/main.html',
controller: 'MainCtrl',
resolve: {
checkAccess: ['accountService', function(accountService) {
accountService.checkAuth(function(){
accountService.checkAccess(function (access){
return access;
});
});
}]
}
})
.state('main.home', {
url: '',
abstract: true,
templateUrl: 'views/home.html',
controller: 'HomeCtrl'
})
.state('main.home.index', {
url: '/',
templateUrl: 'views/home/index.html'
});
.run(['$rootScope', '$state', '$stateParams', 'accountService', function ($rootScope, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
console.dir(toState);
console.dir(toParams);
console.dir(fromState);
console.dir(fromParams);
if (!toState.checkAccess.allowed) {
event.preventDefault();
$state.transitionTo(toState.checkAccess.newState);
}
});
}]);
Это вывод из вызовов console.dir() двух объектов состояния:
Object
name: "main.home.index"
templateUrl: "views/home/index.html"
url: "/"
__proto__: Object
Object
controller: "PlacesCtrl"
name: "main.places.search"
templateUrl: "views/places.html"
url: "/places"
__proto__: Object
Обновление
Ой, забыл упомянуть, что версия AngularJS - v1.2.0-rc.2
$state.current console.dir()
Object
abstract: true
name: ""
url: "^"
views: null
__proto__: Object