В следующем примере я создал decorator
(запускается только один раз для каждого приложения на этапе настройки) и добавил дополнительное свойство в службу $state
, поэтому этот подход не добавляет глобальные переменные в $rootscope
и не требует добавления любая дополнительная зависимость от других служб, кроме $state
.
В моем примере мне нужно было перенаправить пользователя на индексную страницу, когда он уже вошел в систему, и когда он не должен был перенаправить его на предыдущую «защищенную» страницу после входа в систему.
Единственные неизвестные сервисы (для вас), которыми я пользуюсь, это authenticationFactory
и appSettings
:
authenticationFactory
просто управляет логином пользователя. В этом случае я использую только метод, чтобы определить, вошел ли пользователь в систему или нет.
appSettings
являются константами только для того, чтобы не использовать строки везде. appSettings.states.login
и appSettings.states.register
содержат название состояния для входа и регистрации.
Затем в любом controller
/service
и т. д. вам нужно внедрить службу $state
, и вы можете получить доступ к текущему и предыдущему URL-адресу следующим образом:
- Текущий:
$state.current.name
- Предыдущий:
$state.previous.route.name
Из консоли Chrome:
var injector = angular.element(document.body).injector();
var $state = injector.get("$state");
$state.current.name;
$state.previous.route.name;
Реализация:
(я использую angular-ui-router v0.2.17
и 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);
person
CodeArtist
schedule
04.02.2016