解析路由器内的东西时AngularJS错误处理?

时间:2014-08-21 08:15:35

标签: angularjs routing

我一直在研究如何最好地处理错误。我们假设我有这个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 
            })
        }
    }
})

查看评论中的问题。任何线索,提示都非常受欢迎!!

2 个答案:

答案 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对象显示内容。

DEMO

它有效,但我认为这是一种黑客攻击。我不相信Angular应该以这种方式使用。

答案 1 :(得分:3)

您可以使用$location服务重定向到其他路线。

return Videomail.get({key: $route.current.params.key}).$promise.then(function(videomail) {
    return videomail
}, function(err) {
    $location.path('/error')
})