Je travaille sur une applicationIONICdans laquelle j'ai vérifié si l'utilisateur est déjà connecté et si l'utilisateur est déjà connecté, l'application doit être redirigée sur le tableau de bord. Cette fonctionnalité fonctionne bien, mais l'application affiche d'abord la page de connexion pendant quelques secondes, puis redirige vers le tableau de bord.
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');
});
});
Je ne sais pas où je me trompe.
Edit: Je peux authentifier et rediriger vers le tableau de bord mais mon problème est la page de connexion affichée pendant quelques secondes (maximum 2 secondes), puis rediriger vers le tableau de bord et je travaille surIONICapplication
Deuxième édition J'ai trouvé le problème mais je ne connais pas la solution. Les préférences fonctionnent beaucoup dans $ ionicPlatform.ready mais ne fonctionnent pas dans $ locationChangeStart. Et j'ai besoin de préférence dans $ locationChangeStart car il est exécuté avant $ ionicPlatformReady J'ai désespérément besoin de la solution.
Je fais ce qui suit:
dans l'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 est une usine, il stocke la session d'authentification dans le stockage local.
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;
}
}
});
Retirer
$urlRouterProvider.otherwise('/loginpage')
au bas du fichier routes.js.
Je pense que vous devriez écouter l'événement $stateChangeStart
sur le $rootScope
, vous pouvez écouter cet événement pendant l'exécution, comme ceci:
angular.module("myapp.permission").run($rootScope){
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
var loggedIn = true;
if(loggedIn) {
$state.go('app.dashboard');
}
}
}
Les gars essaient cette solution élégante:
si l'utilisateur n'est pas connecté et que la connexion est requise, il est redirigé vers la connexion.
si l'utilisateur essaie de se connecter et qu'il s'est déjà connecté, empêchez-le de le faire.
marquez chaque chemin comme "requireAuth" et cela fonctionnera.
placez votre code dans 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");
}
});
})