2014-10-27 11 views
5

Tôi đang sử dụng trình chặn đánh chặn rất đơn giản để kiểm tra phản hồiRutection cho 403 Truy cập bị cấm để chuyển hướng người dùng đến thông tin đăng nhập, nhưng nó không chuyển hướng. Tôi có thể console.log ngay lên dòng trước $ location.path và sau nó, và nó không bao giờ xảy ra. Có ai khác đã xảy ra chuyện này không? Tôi đã nhìn chằm chằm vào điều này một chút bây giờ ... Ban đầu tôi thậm chí không muốn sử dụng $ vị trí, nhưng tôi không thể tiêm ui.router mà không nhận được một phụ thuộc vòng tròn, mà tôi cũng không thể tìm ra cách để thoát khỏi vị trí như vậy được cho là để giữ cho tôi di chuyển, trong khi tôi nghĩ về nó.AngularJS chuyển hướng không xảy ra trong máy bay đánh chặn

.factory('AuthInterceptor', ['$q', '$location', 
    function($q, $location) { 

    var service = { 
     responseError: function(responseRejection) { 

      // Authorization issue, access forbidden 
      if(responseRejection.status === 403) { 

       // TODO: show a login dialog, and/or redirect to login 
       console.log("Response rejected. Redirecting to login..."); 

       $location.path('/login'); 
       $location.replace(); 

       console.log("Not so much with the redirecting... I'm still here"); 
      } 

      // Propagate error to any chained promise handlers 
      return $q.reject(responseRejection); 
     } 
    } 

    return service; 
}]) 
+2

Khi bạn làm '$ location.path' tuyên bố bên cạnh nó sẽ chạy vì sự thay đổi đường dẫn sẽ chỉ xảy ra trong tiêu hóa chu kỳ tiếp theo. Bạn không thể trực tiếp có thể tiêm '$ state' thay vì bạn có thể tiêm' $ injector' và nhận '$ injector.get ('$ state'). Go (statename)'. Cũng thiết lập đường dẫn vị trí hoặc href vv không chặn hoạt động, có nghĩa là nó sẽ cho phép các kịch bản hiện tại để thực hiện hoàn toàn và sau đó thay đổi locaiton. – PSL

+0

Cảm ơn, tiêm $ injector hoạt động và tôi không biết về hoạt động không chặn nên cảm ơn bạn lần nữa :) Bạn nên thả câu trả lời này vào bên dưới để có thể nhìn thấy rõ hơn và bạn nhận được nhiều tín dụng hơn. Cảm ơn một lần nữa – mtpultz

+0

Vui vì nó hoạt động. Chắc chắn, tôi sẽ thả một câu trả lời. – PSL

Trả lời

2

Khi cài đặt vị trí cửa sổ bằng location.href nó thiết lập vị trí ngay lập tức và đình chỉ thi hành các kịch bản, nhưng sự thay đổi vị trí sẽ chỉ có hiệu lực khi con đường kịch bản hiện tại dưới thực hiện hoàn tất. Đó là lý do tại sao bạn thấy câu lệnh dưới đây href được thực thi. Nó không phải là một hoạt động chặn cũng (không giống như cảnh báo hoặc nhắc nhở). Khi thiết lập vị trí bằng cách sử dụng các wrapper góc nó sẽ có hiệu lực sau khi chu kỳ tiêu hóa. Và bạn có một vấn đề phụ thuộc vòng tròn hợp lệ khi tiêm $state trong $http thiết bị chặn. Để khắc phục mà bạn có thể nhận được trường hợp của $state bằng cách sử dụng $injector.

.factory('AuthInterceptor', ['$q', '$injector', 
    function($q, $injector) { 

    var $state; 

    var service = { 
     responseError: function(responseRejection) { 

      // Authorization issue, access forbidden 
      if(responseRejection.status === 403) { 

       // TODO: show a login dialog, and/or redirect to login 
       console.log("Response rejected. Redirecting to login..."); 

       _setState('login'); 

       console.log("Not so much with the redirecting... I'm still here"); 
      } 

      // Propagate error to any chained promise handlers 
      return $q.reject(responseRejection); 
     } 
    } 
    function _setState(stateName){ 
     if(!$state) { 
      $injector.get('$state'); //Or just get $state from $injector always it is anyways the dependency container and service are singletons 
     } 
     $state.go(stateName); 
    } 
    return service; 
}]); 
+0

Tôi đã làm giống như mã của bạn nhưng định tuyến không hoạt động đúng cách. Trong url vào tuyến đường thành công nhưng chế độ xem không thể hiển thị. Bạn có thể chỉ dẫn tôi. – VjyV

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