Как пропустить страницу входа, если пользователь уже зарегистрирован в ионной структуре
Я работаю над приложением IONIC, где я проверил, был ли пользователь уже зарегистрирован, и если пользователь уже зарегистрирован, приложение должно перенаправить на панель управления. Эта функциональность работает хорошо, но приложение сначала показывает страницу входа в течение нескольких секунд, а затем перенаправляется на панель управления.
app.js
$rootScope.$on("$locationChangeStart", function (event, next, current) {
var prefs = plugins.appPreferences;
prefs.fetch('iuserid').then(function (value) {
if (value != '') {
$state.go('app.dashboard');
}
});
.config(function ($stateProvider, $urlRouterProvider, $httpProvider) {
$stateProvider
.state('app', {
url: "/app",
abstract: true,
templateUrl: "templates/menu.html",
controller: 'AppCtrl'
})
.state('login', {
url: "/login",
templateUrl: "templates/login.html",
controller: 'LoginCtrl'
})
.state('app.dashboard', {
url: "/dashboard",
views: {
'menuContent': {
templateUrl: "templates/dashboard.html",
controller: 'DashboardCtrl'
}
}
})
;
// if none of the above states are matched, use this as the fallback
$urlRouterProvider.otherwise('/login');
});
});
Я не знаю, где я ошибаюсь.
Изменить: Я могу выполнить аутентификацию и перенаправление на панель управления, но моя проблема - это страница входа в систему, отображаемая на несколько (до 2) секунд, а затем перенаправление на панель управления, и я работаю над IONIC
Второе редактирование
Я нашел проблему, но не знаю решения. Предпочтение сильно зависит от $ionicPlatform.ready, но не работает в $locationChangeStart. И мне нужно предпочтение в $locationChangeStart, потому что оно работает до $ionicPlatformReady. Мне отчаянно нужно решение.
Ответы
Ответ 1
Я делаю следующее:
в app.js
.state('login', {
url: "/login",
templateUrl : "templates/session/login.html",
controller : 'SessionCtrl'
})
.state('register', {
url: "/register",
templateUrl : "templates/session/register.html",
controller : 'SessionCtrl'
})
.state('app', {
url: "/app",
abstract: true,
templateUrl : "templates/menu.html",
controller : 'AppCtrl',
onEnter: function($state, Auth){
if(!Auth.isLoggedIn()){
$state.go('login');
}
}
})
.state('app.main', {
url: "/main",
views: {
'menuContent': {
templateUrl : "templates/main_menu.html",
controller : "MainMenuCtrl"
}
}
})
$urlRouterProvider.otherwise('/app/main');
Auth - это factory, он хранит сеанс аутентификации в локальном хранилище.
angular.module('auth.services', [])
.factory('Auth', function () {
if (window.localStorage['session']) {
var _user = JSON.parse(window.localStorage['session']);
}
var setUser = function (session) {
_user = session;
window.localStorage['session'] = JSON.stringify(_user);
}
return {
setUser: setUser,
isLoggedIn: function () {
return _user ? true : false;
},
getUser: function () {
return _user;
},
logout: function () {
window.localStorage.removeItem("session");
window.localStorage.removeItem("list_dependents");
_user = null;
}
}
});
Ответ 2
Я думаю, что вы должны прослушать событие $stateChangeStart
в $rootScope
, вы можете прослушать это событие во время выполнения, например:
angular.module("myapp.permission").run($rootScope){
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
var loggedIn = true;
if(loggedIn) {
$state.go('app.dashboard');
}
}
}
Ответ 3
Ребята попробуют это элегантное решение:
-
если пользователь не вошел в систему, а для входа в систему требуется его перенаправление для входа в систему.
-
если пользователь попытается войти в систему, и он уже вошел в систему, чтобы он этого не делал.
-
отметьте каждый путь как "requireAuth", и он будет работать.
-
поместите свой код в app.js
.run(function ($rootScope, $location, authService) {
$rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) {
if (to.requireAuth && !authService.isAuthed()) {
$location.path("/login");
}
else if (to.name == 'login' && authService.isAuthed()) {
ev.preventDefault();
$location.path("/dashboard");
}
});
})
Ответ 4
Удалите
$urlRouterProvider.otherwise('/loginpage')
внизу файла routes.js.
Ответ 5
Внутри блока "run" и вне $ionicPlatform.ready вы можете использовать это:
//Check if user loggedin and redirect to login page if not
$rootScope.$on('$stateChangeStart', function (event, toState) {
//Check only if you are not in login page
if(toState.name.indexOf('app') !== -1 ) {
// If user is not logged, will redirect to login page, eg:
var prefs = plugins.appPreferences;
prefs.fetch('iuserid').then(function (value) {
if (value != '') {
$state.go('login');
}
});
}
});
После того, как вы должны изменить:
$urlRouterProvider.otherwise('/login');
для этого:
$urlRouterProvider.otherwise('/dashboard');
Идея - это прямой маршрут к панели управления, и если она не вошла в систему, она будет перенаправлена на страницу входа.