$ 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(..)
  }
)