访问Ember ErrorRoute中的错误模型

时间:2014-05-08 05:43:34

标签: javascript ember.js

我正在尝试为我的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);
    }
});

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

如果我无法访问路由的activate方法中的错误,那么我在哪里可以访问它?据推测,我不应该在暂停时包装我的逻辑。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

如果您不关心在*.error路线子网上着陆,如果您仍然要重定向,@ ppcano的answer就足够了。但有时您希望将所有错误处理封装在专用的错误路由对象中。 renderTemplate然后是你处理事情的地方。

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