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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用错误子状态在Ember.js中显示整页错误?相关的知识,希望对你有一定的参考价值。

我正在使用Ember.js和ember-cli v2.7.0。

正如在Loading and Error Substates上的Ember指南中所述,人们可以对通过创建beforeModel动作处理modelafterModel和/或error时出现的错误作出反应,例如:

export default Ember.Route.extend({
  actions: {

    error(err, transitionTo) {
      if (err) {
        return this.transitionTo('error');
      }
    }

  }
  ...
}

如果我将该错误操作放在routes / application.js路由中,我应该能够对任何钩子中发生的错误做出反应。

My goal...

我希望应用程序的默认行为呈现整页错误,理想情况下允许子路由根据交互模型重新定义此行为,例如允许子路由将错误呈现为flash消息区域或模式。

当显示整页错误时,我宁愿这样做而不转换到新的URL。例如,如果有人请求:http://myemberapp.com/some/path和路径错误(出于任何原因),我希望默认行为是在应用程序的主{{outlet}}中显示404,500。

What I've tried so far...

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

Next steps...

现在,显然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版本系列中?

救命?

(提前致谢!)


UPDATE (2016/08/18):

我可以在转换到错误路由的控制器之前为其分配lastError属性,这允许我访问控制器和模板中的错误信息。有没有更好的办法?例如。

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

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

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

以上是关于如何使用错误子状态在Ember.js中显示整页错误?的主要内容,如果未能解决你的问题,请参考以下文章

Ember js构建会引发空合并错误

ember.js 从另一个视图更改视图

Ember.js 路由器:如何动画状态转换

如何在ember.js http请求中使用会话身份验证?

如何在 Ember.js 中获取复选框状态?

Ember.js - 使用 Handlebars 助手检测子视图是不是已呈现