如果模板承诺返回错误,Ember会自动将应用程序路由到错误路径

时间:2016-01-27 13:00:24

标签: ember.js ember-data

如果模型承诺拒绝,给定一条路线很容易让Ember导航到错误路线。目前我有一个简单的方法:error.hbs/routes/error.js,如果模型承诺错误,它会加载错误页面。

我遇到的情况是模型解析得很好,但其中一个关系没有。此关系用于路径模板,例如

{{#each model.addresses as |address id|}}
  {{address.line1}}
{{/each}}

所以myurl.com/api/addresses/1返回500错误。我在控制台窗口中看到了这一点,但Ember不会自动转换到错误页面。如何通过模板请求更多数据而拒绝的所有承诺,我怎样才能做到这一点?

5 个答案:

答案 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)。属性如下

  • isPending - 正在进行的工作正在进行中
  • isFulfilled - 完成,并成功
  • isRejected - 已完成,但失败
  • isSettled, - 完成(失败或成功)

使用这些标志可以如下

{{#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)

在为网页加载数据时,我想问自己, 关键要显示什么数据?也就是说,如果页面上有三个部分 - 由foofoo.barsfoo.baz支持 - 是三个最优先的部分?或者我可以让其中一个失败并显示另外两个?我们假设没有foofoo.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并稍后显示完整内容。