如何使用错误子状态在Ember.js中显示整页错误?

时间:2016-08-18 03:08:55

标签: javascript ember.js error-handling url-routing

我使用的是Ember.js和ember-cli v2.7.0

正如Loading and Error Substates上的Ember指南中所述,人们可以对处理beforeModelmodel和/或afterModel时出现的错误做出反应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和路径错误(出于任何原因),我希望默认行为是显示 404 500 ,在应用程序的主{{outlet}}中。

到目前为止我已尝试过......

我玩过this.transitionTo,我可以有效地从错误子状态转移到整页,但它会将我的用户移动到新的路径。我似乎也没有保留错误上下文,并且将err作为第二个(model)参数传递给transitionTo会导致自己的错误!

后续步骤......

现在,如果我真的想要显示错误"内联"显然,this.transitionTo似乎不是我想要的。到它们出现的页面,因为这将带我到我已经定义的错误页面路径( routes / error.js ),并且据我所知,它转换时没有隐式错误模型以上表格。此外,如上所述,尝试将err作为第二个参数传递会导致错误。

此时,我可以转换为新页面作为临时解决方案,但是在到达新路线时需要能够保留对错误信息的访问权限而且我不知道如何通过错误操作将路径错误上下文正确传递给新路由。

另外,据我所知,无法保证错误行为err将采取何种形式。如果您遵循JSONAPI规范,您最终可能会遇到一种形式的错误(一个JSON对象),但是如果您调用了无效的javascript代码,例如null.boom从我的测试中可以看出错误是不同的。如何解释这一点?我希望能够知道 - 错误是来自客户端还是服务器 - 如果我应该尝试渲染404,500页或其他内容。

(作为奖励,当用户尝试导航到路由器中不存在的URL时,有没有办法让Ember抛出404或类似错误?Globbing ?)

我还想知道我是否假设我可以有一些儿童路线,例如 some.child.route 抢占默认错误处理,支持说警报或模态,是正确的。

在过去的几个月里,我花了相当多的时间学习Ember.js,但这个主题似乎很少分享它。

最后,是否有任何好的文章或教程真正剖析了Ember.js中的错误路由和错误处理主题,特别是在2.x版本系列中?

帮助?

(提前致谢!)

更新(2016/08/18):

我可以在转换到错误路由控制器之前为错误路由控制器分配一个lastError属性,这样我就可以访问控制器和模板中的错误信息。有没有更好的办法? E.g。

error(err, transitionTo) {
  let errorController = this.controllerFor("error")
  errorController.set("lastError", err);
  this.transitionTo("error");
},

1 个答案:

答案 0 :(得分:0)

您可以在应用程序控制器上设置一个包含错误信息的属性,然后使用应用程序模板显示它。



    {{#if error}}
      <div class="error">{{error}}</div>
    {{else}}
      {{outlet}}
    {{/if}}
&#13;
&#13;
&#13;