ค้นหาเว็บไซต์

javascript - ไม่สามารถแสดง material snackbar สำหรับข้อผิดพลาดของ backend โดยใช้ custom ErrorHandler ใน Angular 5


ฉันกำลังพยายามแสดง Snackbar แบบวัสดุสำหรับข้อผิดพลาดของแบ็กเอนด์ในแอป 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);
  }
}

นี่คือตัวอย่าง stackblitz เพื่อแสดงสิ่งที่ฉันหมายถึง

หมายเหตุ :

ฉันพบข้อผิดพลาดนี้ในหลายคำถาม แต่ฉันไม่สามารถแมปคำตอบให้ตรงกับกรณีของฉันได้อย่างแม่นยำ

คำตอบ #1

Angular โหลด ErrorHandler ก่อน providers ซึ่งนี่คือเหตุผลของข้อผิดพลาดเกี่ยวกับการพึ่งพาซ้ำของคุณ

ดังนั้นคุณต้องฉีด MatSnackBar ด้วยตนเอง โดยใช้ Injector ในลักษณะนี้:

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 ของคุณแล้ว ตอนนี้มันทำงานได้แล้ว