ฉันมีรัฐที่ต้องได้รับอนุญาต ฉันฟังเหตุการณ์ $stateChangeStart
และหาก toState.data.protected
และผู้ใช้ไม่ได้รับอนุญาต ฉันจะโทร e.preventDefault()
และ $state.go('login')
เมื่อฉันเปิดแอปใน URL รูท ฉันจะถูกเปลี่ยนเส้นทางไปยังสถานะที่ได้รับการป้องกันโดยอัตโนมัติ สิ่งนี้ทำให้เกิด $digest วนซ้ำ 10 $ และสุดท้ายฉันก็อยู่ในสถานะเข้าสู่ระบบเมื่อฉันเปิดแอปใน URL รูท และฉันถูกเปลี่ยนเส้นทางไปยังสถานะที่ได้รับการป้องกันโดยอัตโนมัติ
Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
ดู plnkr นี้: http://plnkr.co/edit/1voh7m?p=preview
ฉันใช้โค้ดที่คล้ายกันในโครงการอื่นที่มีเชิงมุม 1.2.26 โดยไม่มีข้อผิดพลาดได้สำเร็จ
โค้ดตัวอย่าง 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');
}
});
คุณรู้ไหมว่าอะไรทำให้เกิดการวนซ้ำ?
ฉันสงสัยว่าสิ่งต่าง ๆ อาจจะเกิดขึ้นเช่นนี้:
- สกัดกั้นการเปลี่ยนไปสู่สถานะ main.submain
- เริ่มการเปลี่ยนไปสู่สถานะการเข้าสู่ระบบ
- เราเตอร์ UI ได้รับข้อมูลว่าการเปลี่ยนแปลงครั้งแรกถูกยกเลิก
- เราเตอร์ UI รัน
$urlRouter.update()
และเริ่มเปลี่ยนเป็น main.submain
แก้ไข: การกำหนดค่าสถานะที่ง่ายขึ้น
data: {'protected': true}
บนสถานะหลัก สถานะได้รับการสืบทอดต้นแบบ ดังนั้นสถานะ main.submain จึงมีค่าเท่ากัน - person kvetis   schedule 03.07.2015$urlRouterProvider.otherwise('/main');
หนึ่งสาขา เพราะสำหรับ URL อื่น ๆ ให้ลองเปลี่ยนเส้นทางไปที่ 'main' และคุณอยู่ในวงวนไม่สิ้นสุด ฉันมี เปลี่ยนพลั่วของคุณสักหน่อย ลองตรวจสอบดู: plnkr.co/edit/RyWEusonoBhfQjwD32uu?p=preview ก> - person Grundy   schedule 07.07.2015$urlRouterProvider.otherwise('/main');
กับโซลูชันของฉันได้ - เพราะคุณเพียงต้องการให้มีการเปลี่ยนเส้นทางเริ่มต้น ฉันชอบเสียงระเบิดของคุณและฉันจะโพสต์คำตอบในอีกสักครู่ - person kvetis   schedule 07.07.2015