2015-03-16 27 views
24

Benim açısallar uygulamasında, kullanıcının açılış sayfasında olduğuna ve önceden doğrulanmış olup olmadığına bakıyorum, ardından ana sayfaya yönlendirin.

.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'); 

        } 
       }] 
      } 
     }) 

sorun tüm çözmek kod başarıyla çalıştırılır olsa kullanıcı app.home yönlendiriliyorum olmamasıdır. Birisi bunun neden olduğunu söyleyebilir mi?

Not: Durum 'uygulaması', 'app.home' durumunda görüntülenecek verileri getirdiği bir çözüme de sahiptir.

+2

$ devlet kararlılıkla çalışmalarını etmediğinden. –

+1

Neyi neden ve nasıl açıklarsınız? – Sam

+0

Bu sorunun yanıtlandığı gibi çözülebileceğine inanıyorum [burada] (http://stackoverflow.com/a/36728528/846727) – Kunal

cevap

13

  • Öncelikle bir olay yayabilir ve dinleyici sizin devlet geçişi idare edecek sizin sorunun iki çözümü olabilir. Sen

  • İkincisi orada

    $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');   
         } 
         } 
    }); 
    
+0

Bu durum nereye koyulmalı? – Sam

+0

Ayrıca, $ durumu da enjekte etmediniz. Bu işe yaradığından emin değilim. – Sam

+0

bu, çalışma bloğunun içine yerleştirilir ve $ rootScope ve $ state, burada çalıştırılır (function ($ rootScope, $ state) { $ rootScope. $ On ($ $ $ $ $ $ $ $ $ $ ($, $ stateChangeStart), function (event, toState) { (toState.name === 'sonuç sayfası') { eğer event.preventDefault() (isAuthenticated()!); $ state.go ('home.dashboard'); } } }); ' – ptwo

0

Sen içerikle Denetleyicinizi sağlamak için kararlılığını kullanabileceğiniz yönlendirme koşulunu $ stateChangeStart kanca uygulamak ve kontrol edebilirsiniz ebeveyn kontrol ünitesindeki her yerde de dinleyiciyi uygulayabilirsiniz veya devlete özel olan veriler. Çözüm, denetleyiciye enjekte edilmesi gereken isteğe bağlı bir bağımlılık haritasıdır.

AuthState'i denetleyen ve buna göre yeniden yönlendirmeyi gerçekleştiren bir denetleyiciniz olabilir.

 .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('....'); 
      } 
     }] 
    }) 
+0

ben Bu yaklaşımda olduğu gibi, rotalarımı güvence altına almam gerektiğini ve eriştiği her rotada kullanıcı yetkilendirmesini kontrol etmem gerektiğini varsayalım. Her yerde doğru kopyalamam gerekecek? Uygulamamda çok sayıda rota var – Sam

+0

Ayrıca denedim ve sayfa doğru yönlendirildi, ancak mevcut sayfayı bölünmüş saniye için görüntülemeden önce değil.Denetleyici yönlendirirken geçerli duruma yönlendirmeyi durdurmanın bir yolu var mı? – Sam

+0

Kök düzey soyutlama düzeyinde auth/yönlendirme mantığına sahip olmanızı öneririm ve böylece korunan tüm durumlar yuvalanır. Ancak bu, tüm eyaletlerinizin güncellenmesine ihtiyaç duyacaktır. Gecikme eklemek için, outh durumuna geçmeden önce $ timeout kullanmayı düşünebilirsiniz. – Karthik

26
.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() 

        } 
       }] 
      } 
     }) 

Bu sizin için çalışacak.

+1

Ayrıca bir açıklama da ekleyebilir misiniz? – Robert

+3

@Robert: İçerdeki tek çözüm, mümkün olan şeyi reddeder veya çözer. Zaman aşımı kullanarak calltack'a eklemedikçe state.go() 'nın mümkün olmadığını düşünüyorum. –

+2

Buna benzer yaptım ama $ zaman aşımı olmadan, bunun gibi: 'return $ q.reject(). Catch (function() {$ state.go ('app.home'); $ q.reject();} döndürün) 'o zaman – Gustav

13

Bunun yerine $location.url('/')'u kullanabilirsiniz.

0

Bu eski bir iplik, ama

0

Neyse söz devlete bekliyor çözmek engellemek bir state.resolve() içinde yönlendirmeyi gerçekleştirmek için $ location.path() kullanın. ne yapabildiğini iyi şey dönüş sözdür ve devlet için zaman aşımı ekleyin:

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; 
    }] 
İlgili konular