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()
và $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:
- Intercept việc chuyển đổi sang trạng thái chuyển tiếp main.submain
- Start để đăng nhập trạng thái
- UI bộ định tuyến được các thông tin mà các transiotion đầu tiên có đã hủy
- 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.
Bạn xác định dữ liệu được bảo vệ ở đâu? – user3727843
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
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