Router u-router Angularjs. Come redirect alla pagina di accesso

Ho 4 stati: dashboard , dahboard.main , dashboard.minor , login . dashboard è astratto ed è uno stato genitore per gli stati .minor e .main. Di seguito è riportato il mio codice:

.state('dashboard', { url: "/dashboard", abstract: true, templateUrl: "views/dashboard.html", resolve: { auth: function ($q, authenticationSvc) { var userInfo = authenticationSvc.getUserInfo(); if (userInfo) { return $q.when(userInfo); } else { return $q.reject({ authenticated: false }); } } }, controller: "DashboardCtrl", data: { pageTitle: 'Example view' } }) .state('dashboard.main', { url: "", templateUrl: "views/main.html", controller: "DashboardCtrl", data: { pageTitle: 'Main view' } }) 

Come si vede nello stato dashboard, ho un’opzione di risoluzione. Con questo vorrei redirect l’utente alla pagina di accesso se non è autorizzato. Per questo motivo utilizzo un servizio di autenticazione specialeSvc:

 .factory("authenticationSvc", ["$http", "$q", "$window", function ($http, $q, $window) { var userInfo; function login(email, password) { var deferred = $q.defer(); $http.post("/api/login", { email: email, password: password }) .then(function (result) { if(result.data.error == 0) { userInfo = { accessToken: result.data.accessToken }; $window.sessionStorage["userInfo"] = JSON.stringify(userInfo); deferred.resolve(userInfo); } else { deferred.reject(error); } }, function (error) { deferred.reject(error); }); return deferred.promise; } function getUserInfo() { return userInfo; } return { login: login, logout: logout, getUserInfo: getUserInfo }; }]); 

Controllo il valore auth in config :

 .run(function($rootScope, $location, $state) { $rootScope.$state = $state; $rootScope.$on("routeChangeSuccess", function(userInfo) { consol.log(userInfo); }); $rootScope.$on("routeChangeError", function(event, current, previous, eventObj) { if(eventObj.authenticated === false) { $state.go('login'); } }); }); 

Ma sfortunatamente quando vado al mio stato di root o dashboard del mio sito web ottengo una pagina vuota. Cosa c’è di sbagliato con questo codice? Grazie!

Il punto è, non redirect se non necessario === se già reindirizzato allo stato previsto. C’è un plunker funzionante con una soluzione simile

 .run(function($rootScope, $location, $state, authenticationSvc) { $rootScope.$on( '$stateChangeStart', function(e, toState , toParams , fromState, fromParams) { var isLogin = toState.name === "login"; if(isLogin){ return; // no need to redirect } // now, redirect only not authenticated var userInfo = authenticationSvc.getUserInfo(); if(userInfo.authenticated === false) { e.preventDefault(); // stop current execution $state.go('login'); // go to login } }); }); 

Controlla questi per una spiegazione simile:

  • Router angular ui – Il reindirizzamento non funziona affatto
  • Come posso risolvere “Numero massimo di stack di chiamate superato” AngularJS

Dato che stai usando il modulo UI-Router, dovresti usare $stateChangeStart , $stateChangeSuccess events.

Controlla questo link per maggiori informazioni: https://github.com/angular-ui/ui-router/issues/17

Inoltre c’è un errore di battitura in consol.log(userInfo) nella console .

Controlla la console nei tuoi chrome-dev-tools. Darà un’idea se manca qualcos’altro.

Attenzione che in realtà l’evento $stateChangeSuccess è deprecato e non è più disponibile nel pacchetto angular-ui-route . Ora, questo comportamento è gestito da transition hooks . Potresti raggiungere il tuo scopo utilizzando $transitions.onStart come segue:

 run.$inject = ['$transitions', 'authenticationSvc']; function run($transitions, authenticationSvc) { $transitions.onStart({}, function (trans) { var userInfo = authenticationSvc.getUserInfo(); var $state = trans.router.stateService; if(userInfo.authenticated === false) { $state.go('login'); // go to login } }); }