ฉันชอบคำตอบข้างต้นและเรียนรู้มากมายจากพวกเขา แต่มีบางอย่างที่ขาดหายไปในคำตอบข้างต้นส่วนใหญ่
ฉันติดอยู่ในสถานการณ์ที่คล้ายกันซึ่งฉันแก้ไข URL ด้วยข้อมูลบางอย่างที่ดึงมาจากคำขอแรกจากเซิร์ฟเวอร์ ปัญหาที่ฉันเผชิญคือถ้าสัญญาคือrejected
อะไร
ฉันถูกใช้เป็นผู้ให้บริการที่กำหนดเองที่ใช้ในการส่งคืนPromise
ซึ่งได้รับการแก้ไขโดยresolve
การ$routeProvider
ที่เวลาของขั้นตอนการตั้งค่า
สิ่งที่ฉันต้องการเน้นที่นี่คือแนวคิดของwhen
มันทำอะไรเช่นนี้
มันเห็น url ใน url bar และจากนั้นwhen
block ในส่วนควบคุมที่เรียกว่าและวิวนั้นถูกเรียกว่าดีมาก
ให้บอกว่าฉันมีรหัสเฟส config ต่อไปนี้
App.when('/', {
templateUrl: '/assets/campaigns/index.html',
controller: 'CampaignListCtr',
resolve : {
Auth : function(){
return AuthServiceProvider.auth('campaign');
}
}
})
// Default route
.otherwise({
redirectTo: '/segments'
});
บนรูท url ในบล็อกแรกของการเรียกใช้เบราว์เซอร์otherwise
จะถูกเรียกเป็นอย่างอื่น
ลองนึกภาพสถานการณ์ที่ฉันกดรูทUrlในAuthServicePrivider.auth()
ฟังก์ชั่นแถบที่อยู่ถูกเรียก
ให้บอกว่าสัญญาที่ส่งคืนอยู่ในสถานะ ปฏิเสธแล้ว ???
ไม่มีอะไรแสดงผลเลย
Otherwise
block จะไม่ถูกดำเนินการเนื่องจากเป็น URL ที่ไม่ได้กำหนดไว้ในบล็อกการตั้งค่าและไม่รู้จักเฟสการตั้งค่า angularJs
เราจะต้องจัดการกับเหตุการณ์ที่ถูกไล่ออกเมื่อสัญญานี้ไม่ได้รับการแก้ไข ในความล้มเหลวได้รับการยิง$routeChangeErorr
$rootScope
สามารถบันทึกได้ตามที่แสดงในรหัสด้านล่าง
$rootScope.$on('$routeChangeError', function(event, current, previous, rejection){
// Use params in redirection logic.
// event is the routeChangeEvent
// current is the current url
// previous is the previous url
$location.path($rootScope.rootPath);
});
IMO เป็นความคิดที่ดีที่จะวางรหัสติดตามเหตุการณ์ไว้ในบล็อกแอพพลิเคชั่น รหัสนี้ทำงานหลังจากขั้นตอนการกำหนดค่าของแอปพลิเคชัน
App.run(['$routeParams', '$rootScope', '$location', function($routeParams, $rootScope, $location){
$rootScope.rootPath = "my custom path";
// Event to listen to all the routeChangeErrors raised
// by the resolve in config part of application
$rootScope.$on('$routeChangeError', function(event, current, previous, rejection){
// I am redirecting to rootPath I have set above.
$location.path($rootScope.rootPath);
});
}]);
วิธีนี้เราสามารถจัดการสัญญาที่ล้มเหลวในช่วงเวลาของการกำหนดค่า