Перехватчик или событие $ stateChangeStart для перенаправления на страницу входа с использованием $ location

0

Я пишу перехватчик для перенаправления на страницу входа, если пользователь еще не вошел в систему. Я использую $ 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 не является правильным вариантом.

Теги:
authentication
angular-ui-router
routing

2 ответа

1

Обычно при использовании 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

  • 0
    $ state.go запустил еще одно событие $ stateChangeStart, и оно завершилось бесконечным циклом.
  • 0
    Посмотрите на этот ответ: stackoverflow.com/questions/20094273/… хотя я рекомендую прочитать весь вопрос и все ответы.
Показать ещё 1 комментарий
0

Наконец, найденное решение:

    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');


        });
    });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню