Tôi thích câu trả lời ở trên và học được rất nhiều từ chúng nhưng có một điều còn thiếu trong hầu hết các câu trả lời ở trên.
Tôi đã bị mắc kẹt trong một kịch bản tương tự khi tôi đang giải quyết url với một số dữ liệu được tìm nạp trong yêu cầu đầu tiên từ máy chủ. Vấn đề tôi gặp phải là nếu lời hứa là gì rejected
.
Tôi đã sử dụng một nhà cung cấp tùy chỉnh mà sử dụng để trả về một Promise
trong đó đã được giải quyết bởi resolve
các $routeProvider
tại thời điểm giai đoạn config.
Điều tôi muốn nhấn mạnh ở đây là khái niệm về when
nó làm một cái gì đó như thế này.
Nó thấy url trong thanh url và sau đó when
khối tương ứng trong bộ điều khiển được gọi và chế độ xem được giới thiệu cho đến nay rất tốt.
Hãy nói rằng tôi có mã pha cấu hình sau.
App.when('/', {
templateUrl: '/assets/campaigns/index.html',
controller: 'CampaignListCtr',
resolve : {
Auth : function(){
return AuthServiceProvider.auth('campaign');
}
}
})
// Default route
.otherwise({
redirectTo: '/segments'
});
Trên url gốc trong trình duyệt, khối chạy đầu tiên được gọi nếu không otherwise
được gọi.
Hãy tưởng tượng một kịch bản tôi nhấn rootUrl trong AuthServicePrivider.auth()
hàm thanh địa chỉ được gọi.
Hãy nói rằng Promise trở lại là trong trạng thái từ chối những gì sau đó ???
Không có gì được kết xuất cả.
Otherwise
khối sẽ không được thực thi vì nó dành cho bất kỳ url nào không được xác định trong khối cấu hình và không xác định được pha cấu hình angularJs.
Chúng tôi sẽ phải xử lý sự kiện bị sa thải khi lời hứa này không được giải quyết. Thất bại $routeChangeErorr
bị sa thải$rootScope
.
Nó có thể được chụp như thể hiện trong mã dưới đây.
$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 Nói chung, nên đặt mã theo dõi sự kiện trong khối ứng dụng. Mã này chạy ngay sau giai đoạn cấu hình của ứng dụng.
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);
});
}]);
Bằng cách này, chúng ta có thể xử lý thất bại tại thời điểm cấu hình.