【发布时间】:2018-02-14 12:49:18
【问题描述】:
我在 Angular(5.2.0 版)中为所有未处理的异常实现了一个全局错误处理程序。
全局错误处理程序如下所示:
import { Router } from '@angular/router';
import { ErrorHandler, Injectable, Injector, NgZone } from '@angular/core';
import { LoggingService } from '../services/logging.service';
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
private router: Router;
constructor(injector: Injector, private zone: NgZone, private loggingService: LoggingService) {
setTimeout(() => {
this.router = injector.get(Router);
});
}
handleError(error) {
this.loggingService.logErrorToApi(error);
this.zone.run(() => this.router.navigate(['/error']));
}
}
只有当我有电话 this.zone.run(...) 时,路由才有效。
如果我删除此调用,路由只会将路由 error 添加到 URL 并且不显示组件。 ngOnInit 也没有被调用。
如果我必须使用这样的“hack”来让我的路由对我起作用,那么我的应用程序中的某处似乎存在错误配置。
有人知道我需要改变什么才能让它在没有区域调用的情况下运行吗?
我的路线:
const appRoutes: Routes = [
{
path: 'error',
component: ErrorComponent
},
{
path: '',
component: HomeComponent,
canActivate: [CookieGuard]
},
{ path: '**', component: PageNotFoundComponent }
];
@NgModule({
declarations: [
AppComponent,
HeaderComponent,
FooterComponent,
HomeComponent,
PageNotFoundComponent,
ErrorComponent
],
imports: [
RouterModule.forRoot(appRoutes, { enableTracing: !environment.production }),
BrowserModule,
FormsModule,
ReactiveFormsModule,
HttpClientModule,
HttpClientXsrfModule,
],
providers: [
{ provide: ErrorHandler, useClass: GlobalErrorHandler },
ApiHttpClientService,
AppSettingsService,
CookieGuard,
LoggingService
],
bootstrap: [AppComponent]
})
export class AppModule { }
这是我调用的错误组件:
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'error',
templateUrl: './error.component.html',
styleUrls: ['./error.component.scss']
})
export class ErrorComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
【问题讨论】:
-
你试过类似
this.injector.get(Router).navigate...吗?您首先需要将注入的引用保存到 Injector -
@Jota.Toledo 如果我这样尝试,我会得到相同的行为。错误路由被添加到 url 但视图没有改变。 :(
-
除了组件没有被渲染,你是否在控制台看到任何错误/日志?
-
@Jota.Toledo 除了导致我的错误处理程序被调用的错误之外,控制台中没有错误。我什至从路由中看到了跟踪(因为启用了跟踪)。在 html 中,组件被部分注入,但没有调用 ngOnInit。
-
组件有依赖吗?您可以尝试通过 Injector 实例动态解决 ErrorHandler 的所有依赖项吗?你能提供一个最小的例子吗?
标签: angular angular-router angular-errorhandler