【问题标题】:Angular Material SnackBar and custom ErrorHandler to notify errorAngular Material SnackBar 和自定义 ErrorHandler 来通知错误
【发布时间】:2018-09-03 14:43:47
【问题描述】:

我有一个错误自定义处理程序类,它实现了 Angular 5 核心的 ErrorHandler。如果发生错误,handleError 方法必须通知它发送一个显示的快餐栏材料组件。 如果错误是在测试按钮中抛出的,一切都很好。

如果错误发生在 ngOnInit 方法上,snackbar 将无法正常工作,它会显示在页面的错误位置,您无法再将其关闭。

I.E.

我的组件:

导出类 RootPageComponent 实现 OnInit { 构造函数(){} 公共按钮测试(){ 它发生了; } ngOnInit() { 它发生了; } }

这是我的自定义错误处理程序:

导出类 ErrorHandlerCustom 扩展 ErrorHandler { 构造函数(...){} 处理错误(){ 常量 notificationService = this.injector.get(NotificationService); // 使用snackbar材质的通知自定义 notificationService.exceptionError(error); } }

ngOnInit 中出现错误的结果: ngOnInit error

点击测试按钮: click on test button

【问题讨论】:

  • 请包含您已经尝试过的代码。我们无法猜测您当前的实现是什么来找出错误
  • 我建议您使用stackblitz.com 来演示您的问题
  • 请在问题中包含您的代码。使用图片是个坏主意,因为该网站可能不再存在,您的问题无法搜索,因为图片不是文本,而互联网状况不佳的人将不得不等待一段时间才能加载图片。
  • 感谢您添加解决方案。无需编辑您的问题,只需将其发布为答案并将其标记为解决方案即可。这样其他用户就会知道您的问题已解决。

标签: angular error-handling angular-material snackbar


【解决方案1】:

我终于找到了问题所在。我不知道这是否正确。

在很多情况下,错误处理程序会在 Angular 的区域之外运行。这会导致 toast 无法正常运行,因为没有在其上运行更改检测。所以需要在正常运行时使用zone。

this.zone.run(() => { this.snackBar.open(message, "UNDO"); }

在这里我找到了我的解决方案并发布它以防其他人遇到同样的问题: https://github.com/angular/material2/issues/9875

【讨论】:

【解决方案2】:

就我而言,解决方案是使用this.handleError.bind(this),如下所示:

  public post<T>(url: string, data: any, options?: HttpOptions): Observable<T> {
    return this.http.post<T>(this.baseUrl + url, data, options).pipe(
      map((res: T) => {
        return res as T;
      }),
      catchError(this.handleError.bind(this))
    );

【讨论】:

  • 这个是我的解决方案,因为我在使用管道的 handleError 函数中也遇到了问题。谢谢!
猜你喜欢
  • 2017-10-21
  • 2020-05-09
  • 2020-10-26
  • 1970-01-01
  • 2017-10-20
  • 2018-11-15
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多