【问题标题】:Can't show a material snackbar for the backend errors using custom ErrorHandler Angular 5无法使用自定义 ErrorHandler Angular 5 显示后端错误的材料小吃栏
【发布时间】:2018-10-25 13:32:52
【问题描述】:

我正在尝试为我的 Angular 5 应用程序中的后端错误显示一个材料小吃栏。

我尝试了多种方法,但都没有奏效,似乎 ErrorHandler 类需要一些特殊的方法来正确调用snackbar。

有人可以建议如何处理吗?

我收到此错误:

Provider parse errors:
Cannot instantiate cyclic dependency! ApplicationRef ("[ERROR ->]"): in NgModule AppModule in ./AppModule@-1:-1
Evaluating main.ts

我的自定义 ErrorHandler 类是(没有导入):

@Injectable()
export class MyErrorHandler implements ErrorHandler {

  constructor(public snackBar: MatSnackBar) {}

  handleError(error) {
    const errorMsg = 'an error has happened';
    this.openSnackBar(errorMsg);
    }

  openSnackBar(message: string) {
      this.snackBar.open(message);
  }
}

This is a stackblitz example to show what I mean

注意:

我在多个问题中发现了这个错误,但我无法准确地将答案映射到我的案例

【问题讨论】:

  • 请分享更多代码或工作堆栈闪电战
  • @Vikas 抱歉,我没有注意到链接没有显示代码,现在我更新了它以显示代码,我也会在问题中添加更多代码谢谢你的注意

标签: javascript angular typescript angular-material angular5


【解决方案1】:

Angular 在提供程序之前加载 ErrorHandler,这就是你关于循环依赖的错误的原因。

因此,您需要使用 Injector 手动注入 MatSnackBar,如下所示:

import { Injectable, Injector } from '@angular/core';
import { MatSnackBar } from '@angular/material';

@Injectable()
export class MyErrorHandler implements ErrorHandler {

  private snackbar;
  constructor(private injector: Injector) {}

  handleError(error) {
    this.snackBar = this.injector.get(MatSnackBar);
    const errorMsg = 'an error has happened';
    this.openSnackBar(errorMsg);
  }

  openSnackBar(message: string) {
      this.snackBar.open(message);
  }
}

我已经修改了你的stackblitz,现在可以使用了。

【讨论】:

  • 感激不尽! :) 非常感谢您的宝贵帮助和出色的回答,也感谢您清楚地解释除了解决我一直试图解决几个小时的问题之外的原因。
  • 只是为了提高我对这个概念的理解,为什么我们可以在构造函数中使用注入器而不是任何其他依赖注入(如 MatSnackBar 或我的其他服务)?
  • 可能你有一个共享模块或一个独立模块来加载材料模块。问题是,在角度引导程序中,ErrorHandler 被处理并注入(我说的是以前的方式,带有循环错误),之后,当角度引导程序处理提供程序时,MatSnackBar 再次被注入。循环消息是一个警报,因为也许 angular 可以找到这种情况(有一种方法可以避免该警报,但不推荐)。喷油器有点特别,你可以在这里阅读更多:toddmotto.com/angular-dependency-injection
  • 好的,我想你的意思是 app.module.ts 正在加载我的应用程序中的大部分模块,我会检查链接,再次感谢!
  • 是的,但不要担心它是 ErrorHandler 中典型的使用注入器。但可能最好的方法是工厂供应商,您可以在这里阅读更多相关信息:angular.io/guide/dependency-injection#factory-providers
猜你喜欢
  • 2018-10-26
  • 2017-10-21
  • 2018-06-15
  • 2021-12-09
  • 1970-01-01
  • 2020-05-18
  • 2018-10-29
  • 1970-01-01
  • 2012-06-29
相关资源
最近更新 更多