在Ember ErrorRoute中访问错误模型

Accessing the error model in Ember ErrorRoute

本文关键字:访问 错误模型 ErrorRoute Ember      更新时间:2023-09-26

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

这里的文档似乎建议我可以在我的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控制台日志被触发,错误模型已经建立。

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

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

通常,你在应用程序路由上设置错误处理程序来执行你的应用程序错误逻辑。

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

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

如果你不关心降落在*.error路由子状态,如果你无论如何都要重定向,@ppcano的答案是足够的。但有时你想把所有的错误处理封装在一个专用的错误路由对象中。renderTemplate是你处理事情的地方。

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