如何在全局错误处理程序中正确重定向

gyo*_*dor 6 error-handling angular-ui-router angular

我有这个全局错误处理程序:

import { ErrorHandler, Injectable, Injector } from '@angular/core';
import { Router } from '@angular/router';

    @Injectable()
    export class GlobalErrorHandler extends ErrorHandler  
    {
        constructor(private injector: Injector) {
            super(false);
        }

        handleError(error) {
            super.handleError(error);
            const router = this.injector.get(Router);
                router.navigateByUrl('/error');
        }

    }
Run Code Online (Sandbox Code Playgroud)

我把它放在app.module中:

  providers: [
    {
      provide: ErrorHandler, 
      useClass: GlobalErrorHandler
    }
  ]
Run Code Online (Sandbox Code Playgroud)

为了测试这个我在服务中抛出一个错误.由于某种原因,错误组件与页面的其他内容一起显示.像这样的东西:

如果我通过转到/错误测试错误组件它会显示如下(错误页面是一个单行的段落):

Sorry, something went wrong!
Run Code Online (Sandbox Code Playgroud)

但是当我进入我的主页时,错误应该触发它会显示如下:

Sorry, something went wrong!

....
... Original content for /home
....

Sorry, something went wrong!
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我,我做错了什么?

更新

我已经更新到angular-cli 1.5.2并且还更新到了角度5并且那里的bug似乎已经修复了.我可以使用路由器导航到错误页面.

Zab*_*sky 6

我做了一些研究,这就是为什么它会这样的原因:

由于您在服务中抛出错误,因此无法销毁正在使用该服务的组件,因此路由器无法释放它。感谢@TetraDev指出了这一点

虽然有人可能认为这是一个 Angular 错误,但我无法确认,因为我还没有发现有关它的未解决问题(如果您有链接,请随时更新答案)。

为了解决您的问题,我建议不要Router在这种情况下使用,window.location.href = '/error';而是执行浏览器重定向。