【发布时间】:2020-07-29 16:34:21
【问题描述】:
请考虑以下代码:
//our root app component
import {ChangeDetectionStrategy, Component, ErrorHandler, Injector, NgModule, ViewContainerRef} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
import {ToastModule, ToastsManager} from "ng2-toastr/ng2-toastr";
@Component({
selector: 'my-app',
template: `
<div>
name={{(test$|async).name}}
</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class App {
test$: Observable<{name:string}> = null;
constructor(toastr: ToastsManager, viewContainerRef: ViewContainerRef) {
toastr.setRootViewContainerRef(viewContainerRef);
}
}
export class CustomErrorHandler extends ErrorHandler {
constructor(private injector: Injector) { super(); }
handleError(err: any): void {
super.handleError(err);
this.injector.get(ToastsManager).error(err.message);
}
}
@NgModule({
imports: [ BrowserModule, BrowserAnimationsModule, ToastModule.forRoot() ],
declarations: [ App ],
bootstrap: [ App ],
providers: [
{ provide: ErrorHandler, useClass: CustomErrorHandler, deps: [Injector] }
]
})
export class AppModule {}
也可作为 Plunker here.
组件模板中故意触发错误(test 未定义)。自定义错误处理程序启动,记录错误并尝试弹出错误 toast。不仅吐司不会弹出,而且应用程序也会不断地记录原始错误。稍微挖掘一下似乎表明这是由于反复调用烤面包机的 setTimeout 函数引起的。我尝试过使用不同的烤面包机库做类似的事情,但结果相同。
预期的行为是 toast 弹出一次,错误只记录一次。
知道如何实现这一目标吗?
【问题讨论】:
-
错误处理程序不会产生任何错误。然而,它似乎触发了新一轮的变更检测,从而导致无限循环。
标签: angular