Roteador de interface de usuário angular – Redirecionamento não funciona

Estou usando o ui.router para roteamento no meu aplicativo Angular. Existe um cenário de login típico, no qual estou redirecionando um usuário para o URL de login, se ele não estiver conectado. Sem a biblioteca ui.router, isso funcionou bem usando o evento $ routeChangeStart combinado com $location.path . Agora, estou usando o evento $stateChangeStart , combinado com $state.go , e o nada funciona! Ele também envia meu navegador para um loop infinito. Eu li de outras fonts que esse é um bug conhecido e nenhuma das soluções sugeridas funciona para mim. Além disso, $location.path também não redireciona para a página de login.

Foi assim que configurei meus caminhos:

  .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 meu método de 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'); } }); 

O que nós precisaríamos aqui, é NÃO redirect, se o estado TO já é o ‘login’.

Apenas um ajuste elaborado seria

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

E também, devemos chamar $state.go('login'); com o event.preventDefault();

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

Por favor, verifique este Q & A Como posso corrigir ‘O tamanho máximo de pilha de chamadas ultrapassado’ AngularJS E um plunker com solução semelhante

Eu usei algo parecido com isso:

 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(); } }); }]); 
    Intereting Posts