2013-10-21 17 views
5

Nhà máy của tôi trông giống như:

'use strict'; 

angular.module('myApp') 
    .factory('httpInterceptor',['$q','$location', '$rootScope', function($q, $location, $rootScope){ 
    return { 
     response: function(response) { 

     if(response.success === false) { 
console.log("Redirecting"); 
      $location.path('/login'); 
      return $q.reject(response); 
     } 

     return response || $q.when(response); 
     } 
    } 
}]); 

Nó spits ra nhật ký, nhưng không thay đổi đường dẫn. Tôi có thể làm gì để thực hiện điều này?

+0

Câu hỏi liên quan: http://stackoverflow.com/questions/25579938/location-path-not-working-from-http-interceptor/ – Sirozha

Trả lời

10

Các documentation for $location nói:

Lưu ý rằng setters không cập nhật window.location ngay lập tức. Thay vào đó, dịch vụ định vị $ nhận thức được vòng đời của phạm vi và kết hợp nhiều biến đổi vị trí $ thành một "commit" với đối tượng window.location trong phạm vi $ digest phase.

Do đó, nếu từ chối lời hứa có hiệu lực trên $location, thì bạn có thể không thấy thay đổi dự định.

Để buộc thay đổi ngoài vòng đời của vòng, bạn có thể đặt hash bằng cách sử dụng window.location và sau đó buộc tải lại trang. Điều này sẽ, tất nhiên, ngừng thực hiện bất kỳ mã nào sau và xóa phiên, nhưng đó có thể là những gì bạn muốn nếu người dùng không đăng nhập.

+0

Tôi thấy rất bực mình khi không thể có được các giải pháp góc khác nhau để chuyển hướng làm việc và phải sử dụng window.location để chuyển hướng của tôi. – JnJnBoo

0

Hãy thử

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

thay vì

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

Có một số trường hợp vị trí $ sẽ không chuyển hướng nếu nó là chu kỳ áp dụng bên ngoài góc cạnh. Hãy thử gói $ vị trí bên trong $ áp dụng.

$rootScope.$apply(function(){$location.path('/somelocatin'); }); 
+1

bạn đang lừa dối góc? – Reyraa

+0

có rủi ro khi sử dụng phương pháp này không? Tôi đã sử dụng nó - và nó hoạt động. điều này có ảnh hưởng đến trạng thái ứng dụng không? – orberkov

3

một này làm việc cho tôi trên góc báo 1.3.14

myServices.factory('Factory', ['$rootScope', '$location', function ($rootScope, $location) { 
    // do something and redirect 
    $location.path('path') 
    $rootScope.$apply() 
}]) 

rằng $rootScope.$apply() là sau khi $location.path('path') cuộc gọi, vì một lý do gói nó bên trong $ áp dụng callback gọi như gợi ý ở trên wasn' t làm việc.

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