【发布时间】:2018-07-07 23:43:58
【问题描述】:
我正在尝试为 Angular 5 创建一个错误处理程序。如果通过我的 CustomErrorHandler 触发错误,则应该更新前端。 问题是变量更新后没有任何变化。
error-handler.service.ts
import {ErrorHandler, Injectable} from '@angular/core';
import {Subject} from "rxjs/Subject";
@Injectable()
export class CustomErrorHandler implements ErrorHandler {
message: String = "";
isVisible: boolean = false;
visibilityChange: Subject<boolean> = new Subject<boolean>();
constructor() {
this.visibilityChange.subscribe((value) => {
this.isVisible = value
});
}
handleError(error) {
console.error(error);
this.message = "ERROR: " + error.toString();
this.visibilityChange.next(true);
}
}
错误消息.component.ts
import {Component} from '@angular/core';
import {CustomErrorHandler} from "../../../services/error-handler.service";
@Component({
selector: 'app-error-message',
templateUrl: './error-message.html',
})
export class ErrorMessageComponent {
public message: String = "";
public isVisible: boolean = false;
constructor(private customErrorHandler: CustomErrorHandler) {
this.isVisible = customErrorHandler.isVisible;
}
}
错误处理程序.html
<div class="alert alert-danger" id="app-error" *ngIf="isVisible">
{{message}}
</div>
app.html
<app-nav></app-nav>
<div class="container">
<div class="jumbotron">
<app-error-message></app-error-message>
<app-info-message></app-info-message>
<router-outlet></router-outlet>
</div>
</div>
<app-footer></app-footer>
app.module.ts
@NgModule({
declarations: [
AppComponent,
ErrorMessageComponent,
.....
],
imports: [
BrowserModule,
FormsModule,
HttpClientModule,
AngularFontAwesomeModule,
routing
],
providers: [
UserService,
{
provide: ErrorHandler,
useClass: CustomErrorHandler
},
CustomErrorHandler
],
bootstrap: [AppComponent]
})
export class AppModule {
}
有人知道我做错了什么吗?
【问题讨论】:
-
自定义
ErrorHandler实现应该在模块中提供,它将被使用而不是默认的。您可以拥有一个服务来管理消息和一个注入服务以显示消息的组件。您的自定义错误处理程序可以在出现错误时更新服务。你能解释一下你希望你的设置如何工作吗? -
另外,您是否正在寻找处理 http 错误或抛出的各种错误?
-
这个实现的想法是,在前端显示错误的简短描述,并在日志文件中详细记录所有内容。它应该特别显示 HTTP 错误,但也应该能够显示各种错误。没错,CustomErrorHandler 应该是一个服务。
-
创建
ErrorLogger服务并将其注入CustomErrorHandler。然后CustomErrorHandler将拦截错误并将其发送给ErrorLogger,您的log逻辑可以在ErrorLogger服务中完成。拦截后也会从自定义错误处理程序中抛出错误。 -
对于
http相关的错误,angular支持HttpInterceptor,可以用类似的方式记录http调用。
标签: javascript html angular error-handling angular5