AngularJS в цикле $stateChangeStart
В веб-приложении я хочу, чтобы при маршрутизации пользователя в состоянии $ Angular проверял, есть ли токен и есть ли у него разрешение. Но у меня есть проблема: даже если я делаю event.preventDefault(), он запускает цикл и браузер вылетает. Как я могу предотвратить этот цикл и позволить пользователю идти или заблокировать навигацию?
код:
.run(function ($rootScope, $window, $state, Auth) {
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, $window) {
// Easy case that doesn't loop: just 'return'
if (toState.name === 'login' ){
// doe she/he try to go to login? - let him/her go
return;
}
if (Auth.isLoggedIn && $window.localStorage.identityToken) {
var requiredAdmin = toState.data.requiredAdmin;
if (requiredAdmin && $window.localStorage.isAdmin){
$state.go(toState.name); // it starts the loop
} else { // if he is logged but has no permission, stop the navigation
$state.go(fromState.name); // it starts the loop
}
return;
}
});
1 ответ
Вы должны проверять более высокое состояние, а не каждое изменение состояния, поэтому, если у вас есть маршруты, такие как / login, / secure, / secured /...., вы проверяете условие разрешения состояния / secure, иначе ваша логика будет выполняться при каждом изменении состояния, и это не правильный подход к процессу аутентификации / авторизации.
https://github.com/angular-ui/ui-router/wiki.
таким образом, вы делаете проверку только один раз на дочерних путях.