如果在ng生命周期挂钩期间发生错误,router.navigate不起作用

时间:2017-07-04 13:14:11

标签: angular angular2-routing

我有一个ErrorHandler,用于记录所有异常&然后将用户重定向到通用错误页面。问题是只有当处理的异常发生在任何lifecycle hooks(或构造函数)之外时,这才有效。方法。请考虑使用ngOnInit的以下示例:

class MyErrorHandler implements ErrorHandler {
  constructor(private injector: Injector) { }

  handleError(error) {
    // log error

    var router = this.injector.get(Router);

     router.navigate['/error'];
  }
}

正确调用错误处理程序。但是,router.navigate仅在组件初始化后发生异常时才起作用。

不起作用:

import { Component, OnInit} from '@angular/core';
@Component({
  template: ''
})
export class SampleComponent implements OnInit{
    ngOnInit() {
    throw Error(`Boom!`);
  }
}

按预期工作:

import { Component, OnInit} from '@angular/core';
@Component({
  template: `<button (click)="handleClick()">click me</button>`
})
export class SampleComponent{
      private handleClick(): void{
        throw Error(`Boom!`);
    }
}

我错过了什么或者我怎样才能做到这一点?我想我可以使用windows.location.href,但这会重新加载我宁愿避免的页面。

2 个答案:

答案 0 :(得分:0)

MyErrorHandler 中的注入不正确。

更改

app.module.ts 中的{ provide: ErrorHandler, useClass: MyErrorHandler }
{
  provide: ExceptionHandler,
    useFactory: (router) => {
      return new MyErrorHandler(router);
    },
  deps: [Router]
}

所以现在你已经正确注入了路由器。

答案 1 :(得分:0)

经过一段时间后,我觉得最好的解决方案确实是“重定向”。使用'window.location.href'应用于错误页面。你永远不知道你最终会遇到什么样的错误。在某些情况下,应用程序可能会完全崩溃。