Dans mon application angularjs, je vérifie si l'utilisateur atterrit sur la page de destination et est déjà authentifié, puis je le redirige vers la page d'accueil.
.state('landingpage', {
abstract: "true",
url: "/landingpage",
templateUrl: "app/landingpage/landingpage.html",
resolve: {
AutoLoginCheck: ['$state', '$window', function ($state, $window) {
if($window.localStorage.access_token != null)
{
if($window.sessionStorage.access_token == null) {
$window.sessionStorage.access_token = $window.localStorage.access_token;
}
UserInfoService.SetUserAuthenticated(true);
// it is not redirecting
return $state.go('app.home');
}
}]
}
})
Le problème est que, bien que tout le code de résolution soit correctement exécuté, l'utilisateur n'est pas redirigé vers app.home. Quelqu'un peut-il dire pourquoi cela se produit?
Remarque: L'état 'app' a également une résolution dans laquelle il récupère les données à afficher dans l'état 'app.home'.
Il peut y avoir deux solutions à votre problème
Tout d'abord, vous pouvez émettre un événement et l'auditeur gérera votre transition d'état. Vous pouvez implémenter l'écouteur n'importe où dans un contrôleur parent
Deuxièmement, vous pouvez implémenter le hook $ stateChangeStart et y vérifier votre condition de redirection
$rootScope.$on('$stateChangeStart', function (event, toState) {
if (toState.name === 'landingpage') {
if (!isAuthenticated()) { // Check if user allowed to transition
event.preventDefault(); // Prevent migration to default state
$state.go('home.dashboard');
}
}
});
.state('landingpage', {
abstract: "true",
url: "/landingpage",
templateUrl: "app/landingpage/landingpage.html",
resolve: {
AutoLoginCheck: ['$state','$window', '$q','$timeout', function ($state, $window,$q,$timeout) {
if($window.localStorage.access_token != null)
{
if($window.sessionStorage.access_token == null) {
$window.sessionStorage.access_token = $window.localStorage.access_token;
}
UserInfoService.SetUserAuthenticated(true);
$timeout(function() {
$state.go('app.home')
},0);
return $q.reject()
}
}]
}
})
Cela fonctionnerait pour vous.
Vous pouvez utiliser $location.url('/')
à la place.
Il s'agit d'un ancien thread, mais j'utilise $ location.path () pour effectuer la redirection à l'intérieur d'un bloc state.resolve ()
Vous pouvez utiliser Resolue pour fournir à votre contrôleur un contenu ou des données personnalisés selon l'état. La résolution est une carte facultative des dépendances qui devrait être injectée dans le contrôleur.
Vous pourriez avoir un contrôleur qui vérifie l'AuthState et avoir la redirection en conséquence.
.state('landingpage', {
abstract: "true",
url: "/landingpage",
templateUrl: "app/landingpage/landingpage.html",
resolve: {
AutoLoginCheck: ['$window', function ($window) {
if($window.localStorage.access_token != null)
{
if($window.sessionStorage.access_token == null) {
$window.sessionStorage.access_token = $window.localStorage.access_token;
}
//assuming userInfoService does the authentication
var isAuthenticated = userInfoService.SetUserAuthenticated(true);
return isAuthenticated;
}
}]
},
controller: ['$state','AutoLoginCheck', function($state, AutoLoginCheck){
if(AutoLoginCheck){
//authenticated
$state.go('app.home');
} else {
//redirect to unauthenticated page
$state.go('....');
}
}]
})
Quoi qu'il en soit, résolvez l'attente de l'état promis. La meilleure chose que vous puissiez faire est de renvoyer la promesse et d'ajouter un délai d'expiration pour votre état:
resolve: {
AutoLoginCheck: ['$state', '$window', '$timeout', '$q', function ($state, $window, $timeout, $q) {
var deferred = $q.defer();
if(user.isLogin()){
deferred.resolve();
}else{
$timeout(function(){
$state.go('app.home');
}
deferred.reject();
}
return deferred.promise;
}]