Dans l'exemple suivant, j'ai créé un decorator
(ne s'exécute qu'une fois par application lors de la phase de configuration) et ajoute une propriété supplémentaire à $state
service, cette approche n'ajoute donc pas mondial variables à $rootscope
et ne nécessite pas d'ajouter une dépendance supplémentaire à d'autres services que le $state
.
Dans mon exemple, j'avais besoin de rediriger un utilisateur vers la page d'index lorsqu'il était déjà connecté et, dans le cas contraire, de 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 les suivants authenticationFactory
y appSettings
:
-
authenticationFactory
ne fait qu'administrer la connexion de l'utilisateur. Dans ce cas, j'utilise seulement une méthode pour identifier si l'utilisateur est connecté ou non.
-
appSettings
sont des constantes juste pour ne pas utiliser les chaînes de caractères partout. appSettings.states.login
y appSettings.states.register
contient le nom de l'état pour l'url de connexion et d'enregistrement.
Ensuite, dans tout controller
/ service
etc vous devez injecter $state
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;
Mise en œuvre :
(J'utilise <code>angular-ui-router v0.2.17</code> y <code>angularjs v1.4.9</code> )
(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);