¿Hay alguna manera de obtener el estado anterior del estado actual?
Por ejemplo, me gustaría saber cuál era el estado anterior al estado actual B (donde el estado anterior habría sido el estado A).
No puedo encontrarlo en las páginas de ui-router github doc.
Respuestas:
ui-router no rastrea el estado anterior una vez que realiza la transición, pero el evento
$stateChangeSuccess
se transmite$rootScope
cuando el estado cambia.Debería poder capturar el estado anterior de ese evento (
from
es el estado del que se va):fuente
Utilizo resolver para guardar los datos del estado actual antes de pasar al nuevo estado:
fuente
$stateChangeSuccess
$stateChangeSuccess
funciona, lo hace a nivel global, lo que realmente no se necesita la mayor parte del tiempo.$state.current
es objeto:{name: "", url: "^", views: null, abstract: true}
.En aras de la legibilidad, colocaré aquí mi solución (basada en la respuesta de stu.salsbury).
Agregue este código a la plantilla abstracta de su aplicación para que se ejecute en cada página.
Realiza un seguimiento de los cambios en rootScope. Es bastante útil.
fuente
En el siguiente ejemplo, creé un
decorator
(se ejecuta solo una vez por aplicación en la fase de configuración) y agrega una propiedad adicional al$state
servicio, por lo que este enfoque no agrega variables globales$rootscope
y no requiere agregar ninguna dependencia adicional a otros servicios que no sean$state
.En mi ejemplo, necesitaba redirigir a un usuario a la página de índice cuando ya había iniciado sesión y cuando no debía redirigirlo a la página "protegida" anterior después de iniciar sesión.
Los únicos servicios desconocidos (para usted) que uso son
authenticationFactory
yappSettings
:authenticationFactory
solo administra el inicio de sesión del usuario. En este caso, solo uso un método para identificar si el usuario ha iniciado sesión o no.appSettings
son constantes solo para no usar cadenas en todas partes.appSettings.states.login
yappSettings.states.register
contiene el nombre del estado para la URL de inicio de sesión y registro.Luego, en cualquier
controller
/service
etc necesita inyectar$state
servicio y puede acceder a la URL actual y anterior de esta manera:$state.current.name
$state.previous.route.name
Desde la consola de Chrome:
Implementación:
(Estoy usando
angular-ui-router v0.2.17
yangularjs v1.4.9
)fuente
Agregue una nueva propiedad llamada {anterior} a $ state en $ stateChangeStart
Ahora, en cualquier lugar que necesite, puede usar $ state que tendrá disponible previamente
Y úsalo así:
fuente
Estoy atrapado con el mismo problema y encuentro la forma más fácil de hacer esto ...
O
(Si desea que sea más comprobable, inyecte el servicio $ window en su controlador y use $ window.history.back ()).
fuente
Yo uso un enfoque similar a lo que hace Endy Tjahjono.
Lo que hago es guardar el valor del estado actual antes de hacer una transición. Veamos un ejemplo; imagine esto dentro de una función ejecutada al hacer clic en lo que desencadena la transición:
La clave aquí es el objeto params (un mapa de los parámetros que se enviarán al estado) ->
{ previousState : { name : $state.current.name } }
Nota: tenga en cuenta que solo estoy "guardando" el atributo de nombre del objeto $ state, porque es lo único que necesito para guardar el estado. Pero podríamos tener el objeto de todo el estado.
Luego, indique "lo que sea" se definió así:
Aquí, el punto clave es el objeto params.
Luego, dentro de ese estado, podemos obtener el estado anterior de esta manera:
fuente
Aquí hay una solución realmente elegante de Chris Thielen ui-router-extras: $ previousState
previous
es un objeto que se parece a:{ state: fromState, params: fromParams }
fromState es el estado anterior y fromParams es los parámetros de estado anteriores.fuente
Ok, sé que llego tarde a la fiesta aquí, pero soy nuevo en angular. Estoy tratando de hacer que esto encaje en la guía de estilo de John Papa aquí. Quería hacer esto reutilizable, así que creé en un bloque. Esto es lo que se me ocurrió:
previousStateProvider
módulo principal
core.config
Cualquier crítica a este código solo me ayudará, así que avíseme dónde puedo mejorar este código.
fuente
Si solo necesita esta funcionalidad y desea usarla en más de un controlador, este es un servicio simple para rastrear el historial de rutas:
donde el 'núcleo' en .module ('núcleo') sería el nombre de su aplicación / módulo. Requerir el servicio como una dependencia de su controlador, luego en su controlador puede hacer:
$scope.routeHistory = RouterTracker.getRouteHistory()
fuente
Realizo un seguimiento de los estados anteriores en $ rootScope , por lo que siempre que lo necesite solo llamaré a la siguiente línea de código.
En App.js :
fuente
Para UI-Router (> = 1.0), los eventos StateChange han quedado en desuso. Para una guía completa de migración, haga clic aquí
Para obtener el estado anterior del estado actual en UI-Router 1.0+:
fuente
Una solución realmente simple es simplemente editar la cadena $ state.current.name y cortar todo, incluso después del último '.' - obtienes el nombre del estado padre. Esto no funciona si saltas mucho entre estados porque solo analiza la ruta actual. Pero si sus estados corresponden a donde realmente está, entonces esto funciona.
fuente
$state.go('^')
logrará estoPuede devolver el estado de esta manera:
Un ejemplo:
fuente