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 $state
service, 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 authenticationFactory
et appSettings
:
authenticationFactory
gè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.
appSettings
sont des constantes juste pour ne pas utiliser de chaînes partout. appSettings.states.login
et appSettings.states.register
contient le nom de l'état pour l'URL de connexion et d'enregistrement.
Ensuite, dans n'importe quel controller
/ service
etc, vous devez injecter le $state
service 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.17
et 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);