Nell'esempio seguente ho creato un decorator
(viene eseguito una sola volta per app in fase di configurazione) e aggiunge una proprietà extra al $state
servizio, quindi questo approccio non aggiunge variabili globali$rootscope
e non richiede alcuna dipendenza aggiuntiva da altri servizi oltre a$state
.
Nel mio esempio avevo bisogno di reindirizzare un utente alla pagina dell'indice quando era già connesso e quando non doveva reindirizzare alla precedente pagina "protetta" dopo l'accesso.
Gli unici servizi sconosciuti (per te) che utilizzo sono authenticationFactory
e appSettings
:
authenticationFactory
gestisce solo l'accesso dell'utente. In questo caso uso solo un metodo per identificare se l'utente ha effettuato l'accesso o meno.
appSettings
sono costanti solo per non usare stringhe ovunque. appSettings.states.login
e appSettings.states.register
contiene il nome dello stato per l'URL di accesso e di registrazione.
Quindi in qualsiasi controller
/ service
etc devi iniettare il $state
servizio e puoi accedere all'URL attuale e precedente in questo modo:
- Attuale:
$state.current.name
- Precedente:
$state.previous.route.name
Dalla console di Chrome:
var injector = angular.element(document.body).injector();
var $state = injector.get("$state");
$state.current.name;
$state.previous.route.name;
Implementazione:
(Sto usando angular-ui-router v0.2.17
e 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);