2015-07-02 18 views
5

Tôi có trạng thái yêu cầu ủy quyền. Tôi nghe sự kiện $stateChangeStart và nếu số toState.data.protected và người dùng không được ủy quyền, tôi gọi e.preventDefault()$state.go('login').

Khi tôi mở ứng dụng trong url gốc, tôi tự động được chuyển hướng đến trạng thái được bảo vệ. Điều này gây ra 10 vòng lặp tiêu hóa và tôi kết thúc ở trạng thái đăng nhập khi tôi mở ứng dụng trong url gốc và tôi tự động được chuyển hướng đến trạng thái được bảo vệ.

Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!

Xem plnkr này: http://plnkr.co/edit/1voh7m?p=preview

Tôi sử dụng thành công mã tương tự trong dự án khác nhau với góc 1.2.26 không có lỗi.

Ví dụ mã angular 1.4.1, ui.router 0.2.15:

//config block 
$urlRouterProvider.otherwise('/main'); 
$stateProvider 
.state('main', { 
    url: '/main', 
    templateUrl: 'main.html', 
    controller: 'MainController as main', 
    data: {'protected': true} 
}) 
.state('login', { 
    url: '/login', 
    templateUrl: 'login.html', 
    controller: 'LoginController as login' 
}); 

// in a run block 
$rootScope.$on("$stateChangeStart", function (event, toState) { 
    if (!event.defaultPrevented && toState.data && 
      toState.data.protected) { 
     // the user is not authorized, do not switch to state 
     event.preventDefault(); 
     // go to login page 
     $state.go('login'); 
    } 
}); 

Bạn có biết những gì gây ra vòng lặp?

Tôi tự hỏi nếu những điều có thể xảy ra như thế này:

  1. Intercept việc chuyển đổi sang trạng thái chuyển tiếp main.submain
  2. Start để đăng nhập trạng thái
  3. UI bộ định tuyến được các thông tin mà các transiotion đầu tiên có đã hủy
  4. Bộ định tuyến UI chạy $urlRouter.update() và bắt đầu chuyển đổi sang main.submain

EDIT: Cấu hình trạng thái đơn giản.

+0

Bạn xác định dữ liệu được bảo vệ ở đâu? – user3727843

+0

Sử dụng định nghĩa trạng thái: 'data: {'protected': true}' trên trạng thái chính. Trạng thái được thừa kế nguyên mẫu sao cho trạng thái main.submain có cùng giá trị. – kvetis

+0

Tôi xin lỗi vì tôi đã đính kèm một thư không chính xác mà không trình bày vấn đề. – kvetis

Trả lời

12

Đây là vấn đề của UI.Router - xem vấn đề này trên Github: https://github.com/angular-ui/ui-router/issues/600

Về cơ bản, nếu bạn sử dụng .otherwise('/main') (cũng chỉ ra bởi @Grundy) sau đó url được thay đổi để /main khi con đường không thể được giải quyết. Sau khi $locationChangeSuccess người nghe của tôi được gọi và tôi từ chối chuyển hướng bằng cách sử dụng event.preventDefault(). Điều này làm cho vị trí thay đổi trở lại đường dẫn không xác định do đó gây ra đường dẫn dự phòng được sử dụng lại. Điều này gây ra vòng lặp vô hạn. Giải pháp là thế này:

$urlRouterProvider.otherwise(function($injector) { 
    var $state = $injector.get('$state'); 
    $state.go('main'); 
}); 

Bạn có thể nêu một chức năng mà được gọi với $injector và bạn có thể chuyển hướng đến trạng thái chính của bạn (hoặc 404) mà không thay đổi vị trí back-và-ra. Thx với các bạn trên Github, tôi nên tìm kiếm ở đó trước khi đăng câu hỏi này.

Làm việc plunk: http://plnkr.co/edit/eQXaIk

+1

Giúp, Cảm ơn một tấn! – Rantiev

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