Im folgenden Beispiel habe ich eine erstellt decorator
(wird in der Konfigurationsphase nur einmal pro App ausgeführt) und dem $state
Service eine zusätzliche Eigenschaft hinzugefügt, sodass bei diesem Ansatz keine globalen Variablen $rootscope
zu 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 authenticationFactory
und appSettings
:
authenticationFactory
verwaltet nur die Benutzeranmeldung. In diesem Fall verwende ich nur eine Methode, um festzustellen, ob der Benutzer angemeldet ist oder nicht.
appSettings
sind Konstanten, nur um nicht überall Strings zu verwenden. appSettings.states.login
und appSettings.states.register
enthalten den Namen des Staates für die Anmelde- und Registrierungs-URL.
Dann müssen Sie in jedem controller
/ service
etc $state
Service 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.17
und 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);