2013-12-11 8 views
5

Oturum açmamışlarsa, kullanıcıyı oturum açma yoluna yönlendirmenin bir yolunu temizlemeye çalışıyorum. Çözümüm başka bir SO yanıtına dayanıyordum here Kutunun dışında çalışıyorum. İşte benim çözümüm. Ben rotayı yönlendirmek böylece ben $routeChangeError olayı dinleyebilir neredeKullanıcı kimliği doğrulanmamışsa yönlendirmek için yönlendirin

angular.module('myApp', ['ngResource', 'ngRoute']) 
    .config(['$routeProvider', function ($routeProvider) { 
    var requireAuthentication = function() { 
     return { 
      load: function ($q) { 
       console.log('Can user access route?'); 
       if (g_isloggedIn === true) { // fire $routeChangeSuccess 
        var deferred = $q.defer(); 
        deferred.resolve(); 
        console.log('Yes they can!'); 
        return deferred.promise; 
       } else { // fire $routeChangeError 
        console.log('No they cant!'); 
        return $q.reject("'/login'"); 
       } 
      } 
     }; 
    }; 

    $routeProvider 
     .when('/some_page_that_requires_authentication', { 
      templateUrl: '/views/secret.html', 
      controller: 'secretCtrl', 
      resolve: requireAuthentication() 
     }) 
     .when('/anybody_can_see_me', { 
      templateUrl: '/views/public.html', 
      controller: 'publicCtrl', 
     }); 
}]); 

Sorum şu,? Bunu bir direktifte yapmayı denedim, ancak olayı asla ateşleyemedim. Bir denetleyiciye koyamıyorum çünkü söz reddedilirse yüklenmez. Düşüncesi olan var mı?

Bu soru biraz yardım bulabilirsiniz
+0

"ng-view" öğesinin dışında yer alan herhangi bir denetleyicide (veya yönerge) gözlemlemeniz gerekir. – Stewie

+1

bile 'run() '... kodunuzda hafif bir hata koyabilirsiniz ...' $ q.defer();' '' 'if' – charlietfl

cevap

3

Kullanıcıyı işlevin içinden yeniden yönlendirmemenizin bir nedeni var mı? Bu benim için iyi çalışıyor, söz veriyi çözmezse denetleyiciyi/görünümü yüklemiyor.

böyle fonksiyonu modifiye:

var requireAuthentication = function() { 
    return { 
     load: function ($q, $location) { 
      console.log('Can user access route?'); 
      var deferred = $q.defer(); 
      deferred.resolve(); 
      if (g_isloggedIn === true) { // fire $routeChangeSuccess 
       console.log('Yes they can!'); 
       return deferred.promise; 
      } else { // fire $routeChangeError 
       console.log('No they cant!'); 
       $location.path('/login'); 

       // I don't think this is still necessary: 
       return $q.reject("'/login'"); 
      } 
     } 
    }; 
}; 
+0

den önce bu kodu nereye yazmalı? .config() bloğunda –

+0

belki? Sorudaki gibi. Veya kapsamda bir yer? Sadece bu yüzden kullanılabilir. – wiherek

0

Sana bu konuda geçmiş iyi olduğuna eminim ama şimdi cevaplar arayanlar için, burada benim iki sent.

Burada eksik olan tek şey, söz verilince reddedilen şey. Bunu HTTP kesişimi ile yapmak isteyeceksiniz. Bir dinleyiciyi routeChangeError'a yerleştirirsiniz ve oraya yönlendirirsiniz. https://docs.angularjs.org/api/ng/service/$http (inmeler için aşağıya doğru ilerleyin)