Router angular ui – Il reindirizzamento non funziona affatto

Sto usando ui.router per il routing nella mia app Angular. Esiste uno scenario di accesso tipico, in cui sto reindirizzando un utente all’URL di accesso se non è connesso. Senza la libreria ui.router, questo ha funzionato correttamente usando $ routeChangeStart combinato con $location.path . Ora, sto usando l’evento $stateChangeStart , combinato con $state.go , e il nulla funziona! Invia anche il mio browser in un ciclo infinito. Ho letto da altre fonti che si tratta di un bug noto e nessuna delle soluzioni suggerite funziona per me. Inoltre, $location.path troppo non reindirizza alla pagina di accesso.

Ecco come ho configurato i miei percorsi:

  .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) { $stateProvider .state('main', { url: '/', templateUrl: 'views/main.html', controller: 'MainCtrl' }) .state('about', { url: '/about', templateUrl: 'views/about.html', controller: 'AboutCtrl' }) .state('login', { url: '/login', templateUrl: 'views/loginform.html', controller: 'LoginCtrl' }); $urlRouterProvider.otherwise("/"); }]) 

E il mio metodo di run :

 .run(['$state', '$rootScope', '$location', function($state, $rootScope, $location) { //Check when routing starts //event, next, current $rootScope.$on( '$stateChangeStart', function(e, toState, toParams, fromState, fromParams) { //Redirect to login if the user is not logged in if (!isUserLoggedIn) { //Some suggestion //e.preventDefault(); console.log('Not logged in'); //Infinite loop, kills my browser! $state.go('login'); $state.transitionTo('login'); //Some suggestion $state.go('login', { url: '/login'}); //Doesn't work $location.path('/login'); //$location.path( $state.href('login'); console.log('Redirected'); } }); 

Quello di cui avremmo bisogno qui è NON redirect, se lo stato TO è già il ‘login’.

Sarebbe solo una modifica redatta

 $rootScope.$on( '$stateChangeStart', function(e, toState , toParams , fromState, fromParams) { var isLogin = toState.name === "login"; if(isLogin){ return; // no need to redirect anymore } ... 

Inoltre, dovremmo chiamare $state.go('login'); con event.preventDefault();

  ... // also prevent default on redirect $state.go('login'); event.preventDefault(); ... 

Si prega di controllare questo Q & A Come posso risolvere ‘Dimensione massima dello stack delle chiamate superata’ AngularJS E un plunker con una soluzione simile

Ho usato qualcosa di simile a questo:

 MyApp.run(['$rootScope', '$state', function ($rootScope, $state) { // The event $rootScope.$on('$stateChangeStart', function (e, toState, toParams, fromState, fromParams) { // Is user already logged in? var isUserLoggedIn = $rootScope.isUserLoggedIn(); if (isUserLoggedIn) { // don't let user visit login state, he's already logged in. $state.go('home'); // preventDefault as described in @radim's answer e.preventDefault(); } else if (toState.name === "login") { // user is not logged in and is not going to login state right now, send him there first. $state.go('login'); // preventDefault as described in @radim's answer e.preventDefault(); } }); }]);