2017-07-04 48 views
1

我有一个ErrorHandler,我用它来记录所有异常&然后重定向用户到一般错误页面。问题是,这是否仅是处理的异常出现任何lifecycle hooks(或构造函数)以外的工作。方法。考虑以下示例与ngOnInitrouter.navigate不起作用

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,但那会重新加载页面,这是我宁愿避免的。

+0

我有同样的问题,但在constuctor引发错误(){}导航预期。 – jonas

回答

0

注射液MyErrorHandler是不正确的。

变化{ provide: ErrorHandler, useClass: MyErrorHandler }app.module.ts

{ 
    provide: ExceptionHandler, 
    useFactory: (router) => { 
     return new MyErrorHandler(router); 
    }, 
    deps: [Router] 
} 

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

+0

嘿,谢谢你的建议。试过这个,但是它给ApplicationRef提供循环依赖错误。值得注意的是,我在ErrorHandler中实例化的服务确实有效 - 我可以成功地调用我的服务并执行所有类型的事情 - 除了路由。 – Enn

0

一段时间后,我觉得最好的办法确实是“重定向”应用程序使用'window.location.href'一个错误页面。你永远不知道你到底是什么样的错误了&在某些情况下,应用程序可能受到损坏。