template stateprovider statechangesuccess route javascript angularjs promise angular-ui-router url-routing

javascript - stateprovider - $ estado de transición después de la promesa rechazada Ui-enrutador angular



ui router angularjs resolve (2)

Estoy usando un ui-router angular y tengo una función de resolución configurada para uno de mis estados, antes de que el controlador se inicialice. Recupero algunos datos, lo repito y relaciono con la URL stateParam, y si se encuentra una coincidencia, resuelva la promesa al controlador y devuelva ese objeto en la promesa. Eso está funcionando bien.

Sin embargo, si no se encuentra una coincidencia, simplemente quiero redireccionar a un estado diferente rechazando la promesa y ejecutando $state.go(''state'');

Simplemente esto:

deferred.reject(); $state.go(''state'',{params: ''param''});

Pero esto no parece hacer nada. El controlador simplemente se bloquea y no recibo errores de consola ni nada. ¿Algunas ideas?


Estás malinterpretando cómo funcionan las promesas. deferred.reject() simplemente notifica a la promesa deferred.promise que ha sido rechazada.

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


ui-router se supone que lanza un $stateChangeError si se $stateChangeError una resolución de ruta. Debes mirar este evento y activar la transición de tu estado allí.

Según la wiki:

$stateChangeError : se dispara cuando se produce un error durante la transición. Es importante tener en cuenta que si tiene algún error en sus funciones de resolución (errores de javascript, servicios inexistentes, etc.) no se lanzarán tradicionalmente. Debe escuchar este evento $ stateChangeError para detectar TODOS los errores.

https://github.com/angular-ui/ui-router/wiki#wiki-state-change-events

Como @gustavohenke mencionó en los comentarios, un buen lugar para poner este controlador es la función .run() primaria de su aplicación.