Я пишу перехватчик для перенаправления на страницу входа, если пользователь еще не вошел в систему. Я использую $ location для изменения адреса браузера.
Однако код работает "иногда", если введите URL-адрес для зарегистрированных пользователей (например: http://localhost: 4662/#/index/companies), браузер загрузит шаблон "компании" и изменит адрес URL-адреса на страница входа: (http://localhost: 4662/#/). Поэтому мне нужно нажать Enter, чтобы действительно перенаправить на страницу входа. Иногда это происходит (иногда это означает, что я могу сделать это несколько раз, и я получаю ожидаемое поведение, но внезапно он не делает того, что ожидается)
Это мой код:
$httpProvider.interceptors.push(function ($q, $rootScope, $location, $injector) {
return {
request: function (config) {
//the same config / modified config / a new config needs to be returned.
var applicationService = $injector.get('applicationService');
var loggedIn = applicationService.isLoggedIn();
if (!loggedIn) {
$location.path('/');
//$window.location.href = "#";
} else if ($location.path() == '/') {
$location.path('/index');
}
return config;
},
requestError: function (rejection) {......
Вместо использования перехватчика я попробовал его реализовать прослушиватель изменений маршрутов следующим образом, но я получил точно такую же проблему:
app.run(function($rootScope, $state, $location, applicationService){
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
var loggedIn = applicationService.isLoggedIn();
if (!loggedIn) {
$location.path('/');
} else if (toState.name == 'home') {
$location.path('/index');
}
});
});
Что я делаю не так? Мне интересно, если $ location не является правильным вариантом.
Обычно при использовании ui-router вы программно изменяете состояние, используя метод go
объекта $state
:
$state.go(to [, toParams] [, options])
Удобный способ перехода на новое состояние. $ state.go вызывает $ state.transitionTo внутренне, но автоматически устанавливает параметры в {location: true, inherit: true, relative: $ state. $ current, notify: true}. Это позволяет вам легко использовать абсолютный или относительный путь и указывать только параметры, которые вы хотите обновить (при этом не заданные параметры наследуются от текущего состояния.
https://github.com/angular-ui/ui-router/wiki/Quick-Reference#stategoto--toparams--options
Наконец, найденное решение:
app.run(function($rootScope, $state, $location, applicationService){
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
var loggedIn = applicationService.isLoggedIn();
//Go to home butis logged, redirect to main page (connections)
if (toState.name == 'home' && loggedIn) {
event.preventDefault();
$state.go('index');
return;
}
if (toState.name === 'home') {
// doe she/he try to go to login? - let him/her go
return;
}
if (loggedIn) {
// is logged in? - can go anyhwere
return;
}
// else, is logged in? No- Go to login
event.preventDefault();
$state.go('home');
});
});