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

标签 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 
            })
        }
    }
})

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

最佳答案

由于您不想更改路由,并且不想在 Controller 中处理错误,您可以这样做:

  • 用明确是错误的东西来解决 promise 。您必须解决 promise ,因为如果您不这样做,则根本不会加载路由,并且您无法在 $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 应该这样使用。

    关于解析路由器内部的东西时,AngularJS 错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25421400/

    相关文章:

    html - 如何在 AngularJS 的选择中添加空选项?

    javascript - Angular ui 路由器始终使用默认路由

    ruby-on-rails - Rails 3.2 - 如何重定向到命名空间?

    javascript - 构建 Angular 叉失败

    javascript - 对象的顺序已更改

    javascript - 用于上传调整大小的图像的服务器代码

    c# - 当 url 的一部分已经是另一个路由时,ASP.NET Core 3.1 中的动态路由

    php - Laravel 多个可选参数不起作用

    laravel - 我如何限制对任何路由的直接访问并抛出 404 异常,即使路由存在?

    如果用户已登录,则 Angular 2 重定向