No exemplo a seguir, criei um decorator
(é executado apenas uma vez por aplicativo na fase de configuração) e adiciona uma propriedade extra ao $state
serviço, portanto, essa abordagem não adiciona variáveis globais$rootscope
e não exige a adição de nenhuma dependência extra a outros serviços $state
.
No meu exemplo, eu precisava redirecionar um usuário para a página de índice quando ele já estava conectado e quando ele não deveria redirecioná-lo para a página "protegida" anterior após o login.
Os únicos serviços desconhecidos (para você) que eu uso são authenticationFactory
e appSettings
:
authenticationFactory
apenas administra o login do usuário. Nesse caso, utilizo apenas um método para identificar se o usuário está logado ou não.
appSettings
são constantes apenas para não usar seqüências de caracteres em todos os lugares. appSettings.states.login
e appSettings.states.register
contenha o nome do estado para o URL de login e registro.
Então, em qualquer controller
/ service
etc, você precisa injetar$state
serviço e pode acessar os URLs atual e anterior como este:
- Atual:
$state.current.name
- Anterior:
$state.previous.route.name
No console do Chrome:
var injector = angular.element(document.body).injector();
var $state = injector.get("$state");
$state.current.name;
$state.previous.route.name;
Implementação:
(Eu estou 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);