2016-03-31 32 views
0

Geçtiğimiz günlerde uygulamamda kimlik doğrulamayı uygularken $stateChangeStart etkinliğiyle bir sorunla karşılaşıyorum. Böyle boole değeri ile bazı sayfalara erişimi kısıtlı:Köşeli yönlendirici Maksimum çağrı yığını boyutu aşıldı

.state('login', { 
       url:'/login', 
       templateUrl: 'modules/authentication/views/login.html', 
       controller: 'LoginController', 
       data: { 
        requireAuthentication: false 
       } 
      }) 

ve herhangi bir kimlik doğrulama verisi varsa, kontrol etmek ve kullanıcı requireAuthentication: true bir rota erişirse o otomatik oturum açma sayfasına yönlendirilir. Yani, bu standart bir kimlik doğrulama davranışı.

Uygulama sırasında Maximum call stack size exceeded hatayı aldım. Kodun 10 satırında neyin yanlış olduğunu bulmak için dört gece saat harcadım.

Muhtemelen çalışan bir çözümden sonra (benim gibi) ilgilenecek olanlar için çalışma çözümüm ile bir cevap yayınlayacağım. Bence bu diğer üyeler için önemli bir şey.

angular.module('YourModule', [...dependecies...]) 
 

 
    .run(function($rootScope, $cookies, $state) { 
 
    $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) { 
 
     var shouldLogin = toState.data.requireAuthentication !== undefined 
 
      && toState.data.requireAuthentication; 
 

 
     // NOT authenticated - wants any private stuff 
 
     if(shouldLogin || fromState.name === "") { 
 
      var token = $cookies.get('JWT') == null ? null : $cookies.get('JWT'); 
 
      if (token == null) { 
 
       if(toState.name === 'login') 
 
        return; 
 
       $state.go('login'); 
 
       event.preventDefault(); 
 
      } else { 
 
       if(toState.name === toState.name) 
 
        return; 
 
       //TODO: Check token 
 
       $state.go(toState.name); 
 
       event.preventDefault(); 
 
      } 
 
     } 
 
    }); 
 
});

Yani, $cookies benim kimlik doğrulama verisi alıyorum:

cevap

1

Yani, benim için çalışma çözümü vardır. null ise, login durumuna yönlendiriyorum.

en importaint parçalardır: İlk

if(toState.name === toState.name) 
    return; 

ve

if(toState.name === 'login') 
    return; 

her iki ifade bakarsak gerçekten sayfasını açtığınızda

fromState.name === "" Bu ifade olay işleyicisi ateş yakıyor Hasta, ama hile yaparlar. İstif yığını büyüklüğünü aşan istisnalar almazsınız.

Yukarıdaki kodu Firefox, Chrome, Opera, Mozilla ve Yandex tarayıcıda denedim, bu yüzden sizin için çalışacağını umuyorum.

İlgili konular