我有一個包含 HttpInterceptor 和 ErrorHandler 的 Angular 應用程式。被 HttpInterceptor 攔截的錯誤然后由 ErrorHandler 處理。ErrorHandler 將錯誤訊息推送到 AppComponent 訂閱的 Subject 上。
通過這種方式,我希望在 AppComponent 的視圖中顯示 HTTP 錯誤。
一般方法似乎有效,因為當我呼叫
實際上,由于瀏覽器策略,GET 呼叫失敗,這很好。任何錯誤都可以證明真正的問題:
在 AppComponent 我可以console.log()
看到錯誤訊息,但該訊息未系結到視圖。errorMessage
仍然是"none"
:
Stackblitz 示例:https ://stackblitz.com/edit/angular-ivy-zikova?file=src/app/app.component.ts
uj5u.com熱心網友回復:
是在 Angular Zone 之外呼叫的handleError()
,因此更改檢測不會檢測到組件內部的任何更改。您可以使用 run()
from 的方法NgZone
來避免該問題。
NgZone
將in 注入GlobalErrorHandlerService
并呼叫next()
insiderun
方法。
constructor(private zone: NgZone) { }
handleError(error: any) {
this.zone.run(() => {
this.subject.next(error.message);
});
}
另一種選擇是OnPush
在您的AppComponent
. 設定changeDetection
為ChangeDetectionStrategy.OnPush
并注入ChangeDetectorRef
. 在訂閱者內部呼叫該detectChanges()
方法來檢測更改。
constructor(
private service: Service,
private errorHandlerService: GlobalErrorHandlerService,
private changeDetectorRef: ChangeDetectorRef
) {
this.errorHandlerService.subject.subscribe((message) => {
console.log('Error in AppComponent: ' message);
this.errorMessage = message;
this.changeDetectorRef.detectChanges();
});
this.service.getNonExistentUrl().subscribe(() => console.log('bla'));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/527710.html
標籤:有角度的
下一篇:錯誤:<toHaveBeenCalled>:預期是間諜,但得到了物件({authUser:在AuthService.authUser上的間諜})。用法:expect(<spyObj&