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
y appSettings
:
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
y appSettings.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:
- Actual:
$state.current.name
- Anterior:
$state.previous.route.name
Desde la consola de Chrome:
var injector = angular.element(document.body).injector();
var $state = injector.get("$state");
$state.current.name;
$state.previous.route.name;
Implementación:
(Estoy usando angular-ui-router v0.2.17
y angularjs v1.4.9
)
(function(angular) {
"use strict";
function $stateDecorator($delegate, $injector, $rootScope, appSettings) {
function decorated$State() {
var $state = $delegate;
$state.previous = undefined;
$rootScope.$on("$stateChangeSuccess", function (ev, to, toParams, from, fromParams) {
$state.previous = { route: from, routeParams: fromParams }
});
$rootScope.$on("$stateChangeStart", function (event, toState/*, toParams, fromState, fromParams*/) {
var authenticationFactory = $injector.get("authenticationFactory");
if ((toState.name === appSettings.states.login || toState.name === appSettings.states.register) && authenticationFactory.isUserLoggedIn()) {
event.preventDefault();
$state.go(appSettings.states.index);
}
});
return $state;
}
return decorated$State();
}
$stateDecorator.$inject = ["$delegate", "$injector", "$rootScope", "appSettings"];
angular
.module("app.core")
.decorator("$state", $stateDecorator);
})(angular);