$rootScope.$ on($ stateChangeStart) перенаправляет на страницу входа, если отображается базовый URL

#angularjs #ionic-framework #angular-ui-router

#angularjs #ionic-framework #angular-ui-router

Вопрос:

Я использую angular ui-router, angular-cookies для аутентификации в моем мобильном приложении ionic. Вот мои состояния

     .config(function ($stateProvider, $urlRouterProvider) {
    $stateProvider
      .state('login', {
        url: '/login',
        templateUrl: 'templates/login.html',
        controller: 'LogInCtrl'
      })
      .state('app', {
        url: '/app',
        abstract: true,
        templateUrl: 'templates/menu.html',
        controller: 'AppCtrl'
      })

      .state('app.search', {
        url: '/search',
        views: {
          'menuContent': {
            templateUrl: 'templates/search.html'
          }
        }
      })

      .state('app.browse', {
        url: '/browse',
        views: {
          'menuContent': {
            templateUrl: 'templates/browse.html'
          }
        }
      })
      .state('app.playlists', {
        url: '/playlists',
        views: {
          'menuContent': {
            templateUrl: 'templates/playlists.html',
            controller: 'PlaylistsCtrl'
          }
        }
      })

      .state('app.single', {
        url: '/playlists/:playlistId',
        views: {
          'menuContent': {
            templateUrl: 'templates/playlist.html',
            controller: 'PlaylistCtrl'
          }
        }
      });
    // if none of the above states are matched, use this as the fallback
    $urlRouterProvider.otherwise('/login');
  });
  

Вот мой код метода запуска

 $rootScope.globals = $cookieStore.get('globals') || {};
    if ($rootScope.globals.currentUser) {
      $http.defaults.headers.common['Authorization'] = 'Basic '   $rootScope.globals.currentUser.authdata; // jshint ignore:line
    }

    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
      // redirect to login page if not logged in
        var shouldLogin = typeof $rootScope.globals.currentUser == 'undefined';

        // NOT authenticated - wants any private stuff
        if(shouldLogin || fromState.name === "") {
            var token = $rootScope.globals.currentUser == undefined ? null : $rootScope.globals.currentUser;
            if (token == null) {
                if(toState.name === 'login')
                    return;
                $state.go('login');
                event.preventDefault();
            } else {
                if(toState.name === toState.name)
                    return;
                //TODO: Check token
                $state.go(toState.name);
                event.preventDefault();
            }
        }
    });
  

Аутентификация работает нормально, но когда я изменил свой URL на http://localhost:8100 / он перенаправляет на страницу входа в систему, однако показывает перейти на страницу списка воспроизведения. Нужна помощь, что я делаю неправильно.

Комментарии:

1. Я думаю, у вас нет никакого сопоставления состояний для шаблона url «/», поэтому он перейдет к другому, который является «/ login» в соответствии с вашим приложением js, поэтому он показывает страницу входа.

2. Что происходит typeof $rootScope.globals.currentUser , когда происходит указанное перенаправление?

3. Кроме того, рекомендуется использовать resolve функцию в определении состояния для аутентификации вместо того, чтобы загрязнять $rootScope ее глобальными функциями. Вместо этого вы можете создать службу аутентификации и ввести ее в любое состояние, которое вы хотите аутентифицировать. А также используйте некоторую глобальную конфигурацию в вашей .config функции для ввода любых заголовков, которые вы хотите

4. Это false @nikjohn

5. Почему он перенаправляется на страницу входа, когда я нажимаю только базовый URL?

Ответ №1:

Ваша страница перенаправляется на базовый URL-адрес, потому что:

 $urlRouterProvider.otherwise('/login');
  

Для состояния не определено / , поэтому маршрутизатор выполняет otherwise условие и перенаправляет на /login