#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