Im folgenden Beispiel habe ich eine erstellt decorator(wird in der Konfigurationsphase nur einmal pro App ausgeführt) und dem $stateService eine zusätzliche Eigenschaft hinzugefügt, sodass bei diesem Ansatz keine globalen Variablen $rootscopezu anderen Diensten hinzugefügt werden und keine zusätzliche Abhängigkeit zu anderen Diensten als erforderlich ist $state.
In meinem Beispiel musste ich einen Benutzer auf die Indexseite umleiten, wenn er bereits angemeldet war und wenn er ihn nach der Anmeldung nicht auf die vorherige "geschützte" Seite umleiten sollte.
Die einzigen unbekannten Dienste (für Sie), die ich benutze, sind authenticationFactoryund appSettings:
authenticationFactoryverwaltet nur die Benutzeranmeldung. In diesem Fall verwende ich nur eine Methode, um festzustellen, ob der Benutzer angemeldet ist oder nicht.
appSettingssind Konstanten, nur um nicht überall Strings zu verwenden. appSettings.states.loginund appSettings.states.registerenthalten den Namen des Staates für die Anmelde- und Registrierungs-URL.
Dann müssen Sie in jedem controller/ serviceetc $stateService injizieren und können auf die aktuelle und vorherige URL wie folgt zugreifen:
- Aktuell:
$state.current.name
- Bisherige:
$state.previous.route.name
Über die Chrome-Konsole:
var injector = angular.element(document.body).injector();
var $state = injector.get("$state");
$state.current.name;
$state.previous.route.name;
Implementierung:
(Ich benutze angular-ui-router v0.2.17und 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);