【问题标题】:Accessing the error model in Ember ErrorRoute在 Ember ErrorRoute 中访问错误模型
【发布时间】:2014-05-08 05:43:33
【问题描述】:

我正在尝试为我的 Ember 应用程序中的所有失败路由编写一个处理程序。

文档here 似乎建议我可以在我的 App 对象上创建一个 ErrorRoute,当另一条路由上的路由失败时,它将自动转换到该对象。如果路由失败的原因是由于身份验证问题(例如令牌超时),我想使用它来将用户重定向到登录页面。

我遇到的问题是,在 ErrorRoute 内部,我似乎没有任何方法可以访问失败的路由返回的错误。我想在将它们重定向到登录屏幕之前确认这是一个身份验证错误,但我不知道该怎么做。

这是我为测试而写的:

App.ErrorRoute = Ember.Route.extend({
    activate: function() {
        console.log("MODEL A", this.modelFor('error'));

        setInterval(function() {
            console.log("MODEL B", this.modelFor('error'));
        }.bind(this), 1000);
    }
});

当路由被激活时,控制台会记录MODEL A undefined,因为它试图访问由于某种原因尚未设置的 App.ErrorController 的模型。一秒钟后,MODEL B 控制台日志触发并且错误模型已设置。

如果我无法访问 Route 的 activate 方法中的错误,那么我在哪里可以访问它?大概我不应该在超时中包装我的逻辑。

【问题讨论】:

    标签: javascript ember.js


    【解决方案1】:

    您可以管理当前活动层次结构的任何路径中的错误。

    通常,您在应用程序路由中设置错误处理程序以执行您的应用程序错误逻辑。

    App.AccountRoute = Ember.Route.extend({
    
      afterModel: function() {
    
        return new Em.RSVP.Promise(function(resolve, reject){
    
          throw new AuthenticatedError('error message');
    
        });
      }
    
    });
    
    App.ApplicationRoute = Ember.Route.extend({
    
      actions: {
    
        error: function(error) {
    
          if ( error instanceof AuthenticatedError ) {
            this.transitionTo('login');
          } else {
            // if return true, the event will bubble and transition to error 
            return true;
          }
    
        }
    
      }
    
    });
    

    http://emberjs.jsbin.com/cisur/1/edit

    【讨论】:

    • 这就像一个魅力,感谢 ppcano。我想知道为什么官方指南建议使用 ErrorRoute 重定向到登录屏幕。这对我来说更有意义。
    【解决方案2】:

    错误模型被传递给错误路由的renderTemplate(controller, model)方法。

    如果您不关心登陆*.error 路由子状态,如果您无论如何都要重定向,@ppcano 的answer 就足够了。但有时您希望将所有错误处理封装在一个专用的错误路由对象中。 renderTemplate 那是你处理事情的地方。

    我同意,如果它的钩子有正确的modelFor(...) 可用,那就太好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 2017-10-06
      相关资源
      最近更新 更多