Angular Material SnackBar 和自定义 ErrorHandler 来通知错误
Angular Material SnackBar and custom ErrorHandler to notify error
我有一个错误自定义处理程序 class,它实现了 Angular 5 核心的 ErrorHandler。如果发生错误,handleError 方法必须通知它发送出现的 snackbar material 组件。
如果在测试按钮中抛出错误,一切都很好。
如果错误发生在 ngOnInit 方法上,则 snackbar 无法正常工作,并且显示在页面错误的位置,您无法再将其关闭。
I.E.
我的组件:
export class RootPageComponent implements OnInit {
constructor() {}
public buttonTest() {
it.happens;
}
ngOnInit() {
it.happens;
}
}
这是我的自定义错误处理程序:
export class ErrorHandlerCustom extends ErrorHandler {
constructor(...){}
handleError() {
const notificationService = this.injector.get(NotificationService);
// notification custom using snackbar material
notificationService.exceptionError(error);
}
}
ngOnInit 中的错误结果:
ngOnInit error
点击测试按钮:
click on test button
我终于找到问题了。不知道这个方法对不对
在很多情况下,错误处理程序会 运行 在 Angular 的区域之外。这会导致 toasts 无法正常运行,因为更改检测不会 运行 对其进行处理。所以在 运行.
中正确使用 zone 是很有必要的
this.zone.run(() => {
this.snackBar.open(message, "UNDO");
}
在这里我找到了我的解决方案,我 post 以防万一其他人遇到同样的问题:
https://github.com/angular/material2/issues/9875
在我的例子中,解决方案是使用 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))
);
我有一个错误自定义处理程序 class,它实现了 Angular 5 核心的 ErrorHandler。如果发生错误,handleError 方法必须通知它发送出现的 snackbar material 组件。 如果在测试按钮中抛出错误,一切都很好。
如果错误发生在 ngOnInit 方法上,则 snackbar 无法正常工作,并且显示在页面错误的位置,您无法再将其关闭。
I.E.
我的组件:
export class RootPageComponent implements OnInit { constructor() {} public buttonTest() { it.happens; } ngOnInit() { it.happens; } }
这是我的自定义错误处理程序:
export class ErrorHandlerCustom extends ErrorHandler { constructor(...){} handleError() { const notificationService = this.injector.get(NotificationService); // notification custom using snackbar material notificationService.exceptionError(error); } }
ngOnInit 中的错误结果: ngOnInit error
点击测试按钮: click on test button
我终于找到问题了。不知道这个方法对不对
在很多情况下,错误处理程序会 运行 在 Angular 的区域之外。这会导致 toasts 无法正常运行,因为更改检测不会 运行 对其进行处理。所以在 运行.
中正确使用 zone 是很有必要的this.zone.run(() => { this.snackBar.open(message, "UNDO"); }
在这里我找到了我的解决方案,我 post 以防万一其他人遇到同样的问题: https://github.com/angular/material2/issues/9875
在我的例子中,解决方案是使用 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))
);