Dans l'exemple suivant, j'ai créé un decorator(ne s'exécute qu'une seule fois par application lors de la phase de configuration) et ajoute une propriété supplémentaire au $stateservice, de sorte que cette approche n'ajoute pas de variables globales$rootscope et ne nécessite pas d'ajouter de dépendance supplémentaire à d'autres services que $state.
Dans mon exemple, j'avais besoin de rediriger un utilisateur vers la page d'index quand il était déjà connecté et quand il ne devait pas le rediriger vers la page "protégée" précédente après la connexion.
Les seuls services inconnus (pour vous) que j'utilise sont authenticationFactoryet appSettings:
authenticationFactorygère simplement la connexion de l'utilisateur. Dans ce cas, j'utilise uniquement une méthode pour identifier si l'utilisateur est connecté ou non.
appSettingssont des constantes juste pour ne pas utiliser de chaînes partout. appSettings.states.loginet appSettings.states.registercontient le nom de l'état pour l'URL de connexion et d'enregistrement.
Ensuite, dans n'importe quel controller/ serviceetc, vous devez injecter le $stateservice et vous pouvez accéder à l'url actuelle et précédente comme ceci:
- Actuel:
$state.current.name
- Précédent:
$state.previous.route.name
Depuis la console Chrome:
var injector = angular.element(document.body).injector();
var $state = injector.get("$state");
$state.current.name;
$state.previous.route.name;
La mise en oeuvre:
(J'utilise angular-ui-router v0.2.17et 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);