2014-05-08 37 views
2

我想为我的Ember应用程序中的所有失败路由编写一个处理程序。访问Ember ErrorRoute中的错误模型

文档here似乎表明,我可以让我的应用程序对象的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方法访问错误,那么我在哪里可以访问它?据推测,我不应该把我的逻辑超时。

回答

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

+0

这工作就像一个魅力,感谢ppcano。 我不知道为什么官方指南建议使用ErrorRoute重定向到登录屏幕。这对我来说更有意义。 –

0

的误差模型传递到错误路线的renderTemplate(controller, model)方法。

如果你不关心*.error路由子状态的着陆,如果你打算重定向,// @ ppcano的answer就足够了。但有时候你想把所有的错误处理封装在一个专用的错误路由对象中。 renderTemplate然后是你处理事情的地方。

我同意,虽然,这将是很好,如果它的挂钩提供了正确的modelFor(...)