У меня есть состояние, требующее авторизации. Я слушаю событие $stateChangeStart
, и если toState.data.protected
и пользователь не авторизован, я звоню e.preventDefault()
и $state.go('login')
.
Когда я открываю приложение по корневому URL-адресу, я автоматически перенаправляюсь в защищенное состояние. Это вызывает 10 циклов $digest, и я оказываюсь в состоянии входа в систему, когда открываю приложение в корневом URL-адресе, и меня автоматически перенаправляют в защищенное состояние.
Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
См. этот plnkr: http://plnkr.co/edit/1voh7m?p=preview
Я успешно использую аналогичный код в другом проекте с angular 1.2.26 без ошибок.
Пример кода angular 1.4.1, ui.router 0.2.15
:
//config block
$urlRouterProvider.otherwise('/main');
$stateProvider
.state('main', {
url: '/main',
templateUrl: 'main.html',
controller: 'MainController as main',
data: {'protected': true}
})
.state('login', {
url: '/login',
templateUrl: 'login.html',
controller: 'LoginController as login'
});
// in a run block
$rootScope.$on("$stateChangeStart", function (event, toState) {
if (!event.defaultPrevented && toState.data &&
toState.data.protected) {
// the user is not authorized, do not switch to state
event.preventDefault();
// go to login page
$state.go('login');
}
});
Вы знаете, что вызывает петлю?
Интересно, могут ли вещи происходить следующим образом:
- Перехват перехода в состояние main.submain
- Начать переход в состояние входа
- Маршрутизатор пользовательского интерфейса получает информацию об отмене первого перехода.
- Маршрутизатор пользовательского интерфейса запускает
$urlRouter.update()
и начинает переход на main.submain
EDIT: Упрощенная конфигурация состояния.
data: {'protected': true}
в основном состоянии. Состояние прототипически наследуется, поэтому состояние main.submain имеет то же значение. - person kvetis   schedule 03.07.2015$urlRouterProvider.otherwise('/main');
, потому что для любого другого URL-адреса он пытается перенаправить на 'main' и вы в бесконечном цикле, у меня есть немного измените свой плункер, попробуйте проверить его: plnkr.co/edit/RyWEusonoBhfQjwD32uu?p=preview а> - person Grundy   schedule 07.07.2015$urlRouterProvider.otherwise('/main');
с моим решением, потому что вы просто хотите иметь какое-то перенаправление по умолчанию. Мне нравится ваш план, и я опубликую ответ через минуту. - person kvetis   schedule 07.07.2015