2015-03-03 27 views
5

Tôi biết câu hỏi này đã được thảo luận nhiều lần nhưng các giải pháp không phù hợp với yêu cầu của tôi. Nhiệm vụ rất đơn giản. Nếu người dùng không đăng nhập người dùng nên được chuyển hướng đến trang đăng nhập. Khi tôi làm điều đó trong $ trên, nó tạo ra vòng lặp vô hạn. Hãy cho tôi biết giải pháp tốt nhất là gì.angularjs ui-router tạo vòng lặp vô hạn

var adminpanel = angular.module('administrator', ['ngMessages','ui.router','ui.bootstrap','ngCookies']); 
    adminpanel.config(function ($stateProvider, $urlRouterProvider) { 
    // $urlRouterProvider.otherwise("/login"); 
     $urlRouterProvider.otherwise(function($injector, $location) { 
       var $state = $injector.get("$state"); 
       $state.go("login"); 
      }); 
       $stateProvider 
       .state('login', { 
           url: "/login", 
           controller:"userCtrl", 
           templateUrl: "views/login.tpl.html", 
           permissions:{except:['admin']} 
           } 
        ) 
        .state('menu', { 
           templateUrl: "views/menu.tpl.html", 
           controller:'adminCtrl', 
           permissions:{allow : ['admin']} 
           } 
        ) 
        .state('menu.dashboard', { 
           url: "/dashboard", 
           templateUrl: "views/dashboard.tpl.html", 
           permissions:{allow : ['admin']} 
           } 
        ) 

}); 


adminpanel.run([ '$rootScope', '$state', '$stateParams','$cookieStore',function ($rootScope, $state, $stateParams,$cookieStore) { 
$rootScope.$state = $state; 
    $rootScope.$stateParams = $stateParams; 
     $rootScope.$on('$stateChangeStart',function(event, toState, fromState){ 

      if($rootScope.session == undefined && $cookieStore.get('name') == undefined){$rootScope.session={}} 
      else if($rootScope.session == undefined && $cookieStore.get('name') != undefined){ 
        $rootScope.session={set:true, name : $cookieStore.get('name'), userid :$cookieStore.get('userid'), role:$cookieStore.get('role')}; 
      }; 
     //Added below lines as update  
      if(toState.name === "login"){ 
       return; 
      } 
     //Added above lines as update 
     var authorized = true; 
     if(Object.keys($rootScope.session).length === 0){ 
       event.preventDefault(); 
      $state.go('login'); 
     } 
     else if(Object.keys(toState.permissions).length !=0){ 
        console.log($rootScope.session.role); 
        angular.forEach(toState.permissions, function(value,key){ 
        angular.forEach(value,function(role){ 
         if(key === 'except' && role === $rootScope.session.role) 
         {authorized = false;} 
         else if(key === 'allow' && role !== $rootScope.session.role) 
         {authorized = false;}; 
        }); 
       }); 
} 
if(!authorized){ 
         event.preventDefault(); 
         $state.go('menu.dashboard'); 
       }; 

     }); 

}]); 

Cảm ơn bạn đã trợ giúp.

Cập nhật 1:

Giải pháp hoạt động tốt. Nhưng nếu người dùng đăng nhập, người dùng sẽ không truy cập vào trang đăng nhập nếu anh ta cố gắng truy cập nó thông qua thanh địa chỉ. Vì vậy, tôi đã tạo một tham số quyền với khóa ngoại trừ.

Nhưng nếu người dùng truy cập trang đăng nhập thông qua thanh địa chỉ, trang đăng nhập sẽ được tạo và không được chuyển hướng đến menu.dashboard.

Hy vọng tôi rõ ràng.

Trả lời

4

Vấn đề ở đây, là để tránh chuyển hướng, nếu nó đã xảy ra rồi , nếu đã chuyển hướng:

... 
// never redirect to state, if already going there 
if(toState.name === "login"){ 
    return; 
} 

// evaluate some IF here only if we go to other state then login 
if(Object.keys($rootScope.session).length === 0) { 
    event.preventDefault(); 
    $state.go('login'); 
    return; 

} 
+0

Cảm ơn rất nhiều bạn của tôi. Tôi đã đánh nó trong hơn 6 giờ. – alaksandarjesus

+0

Tuyệt vời nếu điều đó giúp ích gì;) Thưởng thức giao diện người dùng tuyệt vời!) –

+0

Tôi vừa cập nhật. Bạn có thể có một cái nhìn @Radim Kohler Nhưng nếu người dùng truy cập trang đăng nhập thông qua thanh địa chỉ, trang đăng nhập được tạo, không nên và nó sẽ được chuyển hướng đến menu.dashboard. – alaksandarjesus

2

Thay đổi nếu vòng lặp và nó làm việc theo yêu cầu. Dưới đây là mã làm việc.

if(Object.keys($rootScope.session).length === 0){ 
      if(toState.name === "login"){ 
       return; 
      } 
      else{ 
       event.preventDefault(); 
      $state.go('login'); 
      } 
     } 
     else if(Object.keys(toState.permissions).length !=0){ 

        angular.forEach(toState.permissions, function(value,key){ 
        angular.forEach(value,function(role){ 
         if(key === 'except' && role === $rootScope.session.role) 
         {authorized = false;} 
         else if(key === 'allow' && role !== $rootScope.session.role) 
         {authorized = false;}; 
        }); 
       }); 
      }; 
     if(!authorized){ 
        event.preventDefault(); 
        $state.go('menu.dashboard'); 
      }; 
+0

một công việc tuyệt vời! Tuyệt vời, thực sự :) –

Các vấn đề liên quan