2016-10-13 4 views
1

В моей app.module.ts у меня есть:Angular2: Инъекционное маршрутизатор в myExceptionHAndler

@NgModule({ 
    declarations: [ 
     AppComponent, 
    ], 
    imports: [ 
     BrowserModule, 
     FormsModule, 
     ReactiveFormsModule, 
     HttpModule 
    ], 
    providers: [ 
     {provide: ErrorHandler, useClass: MyExceptionHandler} 
    ], 
    bootstrap: [AppComponent], 
}) 
export class AppModule {} 

Тогда в моем MyExceptionHandler:

import { Injectable } from "@angular/core" 
import { Router } from "@angular/router" 

@Injectable() 
export class MyExceptionHandler { 
    constructor (private _router: Router) {} 

    handleError(error:any):void { 
     ... 
    } 
} 

Однако, я имею ошибку говоря: Error: Error: Provider parse errors

Если я используйте MyExceptionHandler как обычный провайдер, он отлично работает. Поэтому я предполагаю, что ErrorHandler будет обработан до того, как маршрутизатор будет точно существовать. В любом случае, чтобы исправить это?

+0

Можете ли вы попытаться придать 'Injector' вместо' Router' и использовать 'this._router = injector.get (Rotuer)'. Инъекция в 'ErrorHandler' часто вызывает круговые зависимости, которые можно обойти этим способом. Я также думаю, что ваш MyExceptionHandler должен реализовать 'ErrorHandler'. –

+0

Хорошо, вы могли бы привести пример того, как вводить инжектор? – Scipion

+0

'конструктор (инжектор: инжектор) {this._router = injector.get (Rotuer); } ';-) –

ответ

3

Согласно https://github.com/angular/angular/issues/9843 работающий код будет выглядеть следующим образом:

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

@Injectable() 
export class GlobalErrorHandler extends ErrorHandler { 
    private _router: Router; 
    constructor(private _injector: Injector) { 
     // The true parameter tells Angular to rethrow exceptions, 
     // so operations like 'bootstrap' will result in an error 
     // when an error happens. If we do not rethrow, 
     // bootstrap will always succeed. 
     super(true); 
    } 

    handleError(error: any): void { 
     // Delegate to the default handler. 
     super.handleError(error); 

     if (!this._router) { 
      this._router = this._injector.get(Router); 
     } 

     // TODO: log error and then redirect to 500 page. 
     this._router.navigate(['/errors/500']); 
    } 
} 
Смежные вопросы