如果模型承诺拒绝,给定一条路线很容易让Ember导航到错误路线。目前我有一个简单的方法:error.hbs
和/routes/error.js
,如果模型承诺错误,它会加载错误页面。
我遇到的情况是模型解析得很好,但其中一个关系没有。此关系用于路径模板,例如
{{#each model.addresses as |address id|}}
{{address.line1}}
{{/each}}
所以myurl.com/api/addresses/1
返回500错误。我在控制台窗口中看到了这一点,但Ember不会自动转换到错误页面。如何通过模板请求更多数据而拒绝的所有承诺,我怎样才能做到这一点?
答案 0 :(得分:1)
一种解决方案是在路由RSVP.Promise
中返回model()
,它会加载所有数据(也是关系,而不是稍后通过模板延迟加载它们),如果任何异步请求失败,则拒绝。
答案 1 :(得分:0)
如果没有错误,Ember会自动生成错误页面,如果ember依赖于DS.error对象进行转换,则必须满足要求才能让Ember识别出有效错误,在Ember 2.x中错误代码必须是422,并且必须遵循jsonapi http://jsonapi.org/format/#errors-processing
答案 2 :(得分:0)
我写了一篇关于在这里使用Route错误子状态的长篇文章 - > https://pixelhandler.com/posts/emberjs-handling-failure-using-route-error-substates
答案 3 :(得分:0)
所以最终,错误处理是因为知道“什么破坏”和“谁拥有它破坏的事实”。通常,如果X要求Y和Y失败,则X的工作是显示错误。在该示例中,如果FooRoute触发ajax,并且失败,则FooRoute或多或少应该处理错误。
但是当涉及到导致提取的模板时,它实际上成为模板的责任。
可以做的一件事是,实际上绑定到表示PromiseProxy上的异步操作的各种布尔属性(在您的情况下为model.addresses
)。属性如下
使用这些标志可以如下
{{#if model.addresses.isPending}}
loading...
{{else if mode.addresses.isRejected}}
Sorry something went wrong, {{model.addresses.reason.message}}
{{else}}
{{#each model.addresses as |address| }}
...
{{/each}}
{{/if}}
答案 4 :(得分:0)
在为网页加载数据时,我想问自己, 关键要显示什么数据?也就是说,如果页面上有三个部分 - 由foo
,foo.bars
和foo.baz
支持 - 是三个最优先的部分?或者我可以让其中一个失败并显示另外两个?我们假设没有foo
或foo.bars
,我们会显示错误页面,但foo.baz
是可选的。在那种情况下,我会把它写成
// controller:foo
model(params) {
return this.get('store').find('foo', params.id);
},
afterModel(foo) {
return foo.get('bars'); // block on foo.bars fetch
}
然后我可能会有{{foo-baz}}
组件首先呈现正在加载... ,然后在后台提取foo.baz
并稍后显示完整内容。