$ state после отклонения обещания Angular ui-router
Я использую Angular ui-router и имею функцию разрешения, настроенную для одного из моих состояний, прежде чем инициализируется контроллер. Я извлекаю некоторые данные, просматриваю и сопоставляю их с URL stateParam, и если совпадение найдено, разрешите обещание контроллеру и верните этот объект в обещание. Это хорошо работает.
Однако, если совпадение не найдено, я просто хочу перенаправить на другое состояние, отклонив обещание и запустив $state.go('state');
Просто это:
deferred.reject();
$state.go('state',{params: 'param'});
Но это ничего не делает. Контроллер просто зависает, и я не получаю никаких консольных ошибок или чего-то еще. Любые идеи?
Ответы
Ответ 1
ui-router должен выбрасывать $stateChangeError
, если отклонение маршрута отклонено. Вам нужно следить за этим событием и запускать там переход состояния.
Согласно вики:
$stateChangeError
- срабатывает при возникновении ошибки во время перехода. Важно отметить, что если у вас есть какие-либо ошибки в ваших функциях разрешения (ошибки JavaScript, несуществующие службы и т.д.), Они традиционно не будут бросаться. Вы должны прослушать это событие $stateChangeError, чтобы уловить ВСЕ ошибки.
https://github.com/angular-ui/ui-router/wiki#wiki-state-change-events
Как упоминается в комментариях @gustavohenke, хорошим местом для размещения этого обработчика является ваша основная функция .run()
вашего приложения.
Ответ 2
Вы не понимаете, как работает promises. deferred.reject()
просто уведомляет deferred.promise
о том, что он был отклонен.
var promise = deferred.promise;
promise.then(
function (result) {
// this function runs if the promise was resolved
},
function (result) {
// this function runs if the promise was rejected
// this is where you should put $state.go(..)
}
)