我一直在研究如何最好地处理错误。我们假设我有这个AngularjS代码:
$ routeProvider
.when('/videomail/:key', {
templateUrl : 'view.html',
controller : 'ViewCtrl',
title : 'View',
hideHeader : true,
hideFooter : true,
resolve: {
videomail: function($rootScope, $route, Videomail) {
return Videomail.get({key: $route.current.params.key}).$promise.then(function(videomail) {
return videomail
}, function(err) {
// How can I present the error here?
// Should I return it like 'return err' and let the controller deal with it?
// Or can I forward this to another controller?
// PS: It can be a 404 or a 401 error
})
}
}
})
查看评论中的问题。任何线索,提示都非常受欢迎!!
答案 0 :(得分:4)
由于您不希望路线发生变化,并且您不想在控制器中处理错误,您可以这样做:
使用毫无疑问是错误的内容来解决承诺。您必须解决这个承诺,因为如果您没有,则根本不会加载该路线,并且您无法在$routeChangeError
中更改该路线。
videomail: function($rootScope, $route, Videomail) {
return Videomail.get({key: $route.current.params.key}).$promise.then(function(videomail) {
return videomail
}, function(err) {
return { resolveError: err }
})
}
在应用中的某个位置(可能在run
中),拦截$routeChangeSuccess
并检查是否发生了错误。
$rootScope.$on('$routeChangeSuccess',
function (event, current, previous) {
if (current.locals.videomail && current.locals.videomail.resolveError) {
current.locals.$template = $templateCache.get('error.html')
$rootScope.error = current.locals.videomail.resolveError
}
}
)
现在您只需编写一个名为error.html
的模板,该模板将根据范围中的error
对象显示内容。
它有效,但我认为这是一种黑客攻击。我不相信Angular应该以这种方式使用。
答案 1 :(得分:3)
您可以使用$location
服务重定向到其他路线。
return Videomail.get({key: $route.current.params.key}).$promise.then(function(videomail) {
return videomail
}, function(err) {
$location.path('/error')
})