Javascript 如何使用错误子状态在Ember.js中显示整页错误?
我正在使用Ember.js和Ember cli v2.7.0 如《Ember指南》中所述,当处理Javascript 如何使用错误子状态在Ember.js中显示整页错误?,javascript,ember.js,error-handling,url-routing,Javascript,Ember.js,Error Handling,Url Routing,我正在使用Ember.js和Ember cli v2.7.0 如《Ember指南》中所述,当处理前模式、模式、和/或后模式时,用户可以通过创建错误操作对错误作出反应,例如: export default Ember.Route.extend({ actions: { error(err, transitionTo) { if (err) { return this.transitionTo('error'); } } } .
前模式
、模式
、和/或后模式
时,用户可以通过创建错误
操作对错误作出反应,例如:
export default Ember.Route.extend({
actions: {
error(err, transitionTo) {
if (err) {
return this.transitionTo('error');
}
}
}
...
}
如果我将该错误操作放在routes/application.js路由中,我应该能够对这些钩子中发生的错误做出反应
我的目标。。。
我希望应用程序的默认行为呈现完整页面错误,理想情况下允许子路由根据交互模型重新定义此行为,例如允许子路由将错误呈现到flash消息区域或模式中
当显示一个完整的页面错误时,我更希望这样做而不转换到一个新的URL。例如,如果有人请求:http://myemberapp.com/some/path
和路径错误(出于任何原因),我希望默认行为是在应用程序的主{{outlet}
中显示404,500
到目前为止我所尝试的。。。
我一直在玩这个。转换到后,我可以有效地从错误子状态移动到完整页面,但它会将我的用户移动到新路径。我似乎也没有保留错误上下文,将err
作为第二个(model
)参数传递到transition
会导致它自己的错误
下一步。。。
现在,很明显,这似乎是。如果我真的想将错误“内联”显示到发生错误的页面上,那么transitiono
就不是我想要的了,因为这将把我带到我定义的错误页面路由(routes/error.js),据我所知,在没有上述形式的隐式错误模型的情况下进行转换。此外,如上所述,尝试传递err
作为第二个参数会导致错误
此时,我可以将转换到新页面作为临时解决方案,但需要能够在到达新路由时保留对错误信息的访问,并且我不知道如何正确地将错误上下文从发生错误的路由通过错误操作传递到新路由
此外,据我所知,无法保证错误动作中会出现什么形式的错误,err
。如果遵循JSONAPI规范,可能会出现一种形式的错误(JSON对象),但如果调用无效的javascript代码,例如null.boom
,则从我的测试中可以看出错误是不同的。如何解释这一点?我希望能够知道——错误是来自客户端还是服务器——我是否应该尝试呈现404、500页或其他内容
(作为奖励,当用户试图导航到路由器中不存在的URL时,有没有办法让Ember抛出404或类似的错误?可能?)
我还想知道我的假设是否正确,即我可以有一些子路由,例如some.child.route先发制人的默认错误处理,比如警报或模式
在过去的几个月里,我花了相当多的时间学习了Ember.js,但是这个主题似乎很少有关于它的知识共享
最后,是否有好的文章或教程真正剖析了Ember.js中的错误路由和错误处理主题,特别是在2.x发行版系列中
帮忙
(提前感谢!)
更新(2016/08/18):
在转换到允许我访问控制器和模板中的错误信息之前,我可以将lastError
属性分配给错误路由的控制器。有更好的办法吗?例如
error(err, transitionTo) {
let errorController = this.controllerFor("error")
errorController.set("lastError", err);
this.transitionTo("error");
},
您可以使用错误信息在应用程序控制器上设置属性,然后使用应用程序模板显示该属性
{{#if error}
{{error}}
{{else}
{{outlet}}
{{/if}}
如果你得到一个解决方案,一定要在这里发布。绝对!我还没有机会重温这一点,但我计划很快研究它。如果我找到了一个很好的解决方案(甚至是一个“可行的黑客”),我很乐意与大家分享!您可以使用服务
和初始值设定项
将错误对象添加到该服务中。下面是一个如何使用ember服务处理全局通知的示例。