2017-01-11 2 views
8

Ich habe den folgenden Code:Angular2 Spritzen Dienstleistungen in benutzerdefinierten Fehlerbehandler

app.module.ts:

NgModule({ 
    declarations: [ 
     AppComponent 
    ], 
    imports: [ 
     RouterModule, 
     BrowserModule, 
     ReactiveFormsModule, 
     FormsModule, 
     HttpModule, 
     AppRoutingModule // Routes 
    ], 
    providers: [ // services 
     AppLog, 
     {provide: ErrorHandler, useClass: MyErrorHandler} 
    ], 
    bootstrap: [AppComponent] 
}) 
export class AppModule {} 

MyErrorHandler.ts:

@Injectable() 
export class MyErrorHandler implements ErrorHandler { 
    constructor (private _appLog: AppLog) {} 

    handleError(error:any):void { 
    let errorMessage: string = "" + error 
    this._appLog.logMessageAsJson(errorMessage, "error") 
      .subscribe(
       ... 
      ) 
    } 
} 

appLog.ts

@Injectable() 
export class AppLog { 
    constructor (private _http: Http) {} 

    logMessageAsJson(message: string, type: string) { 
     let headers = new Headers({ "Content-Type": "application/json" }) 
     let jsonMessage = {"type": type, "message": message} 

     return this._http.post(JSON.stringify(jsonMessage), headers) 
    } 
} 

Wenn jedoch mein app Bootstrap, versagt es, wenn ich eine Injektion in MyErrorHandler mit dem folgenden Fehler habe:

Unhandled Promise rejection: Provider parse errors: 
Cannot instantiate cyclic dependency! 

Wenn ich constructor (private _appLog: AppLog) {} entfernt und dann etwas anderes in handleError tue es funktioniert ganz gut und die Fehlerbehandler sind namens.

Ich denke, es nicht als AppLog und MyErrorHandler funktioniert auf der gleichen Zeit instanziiert

Antwort

8

Sie diese Abhilfe verwenden können zyklische Abhängigkeiten mit DI

@Injectable() 
export class MyErrorHandler implements ErrorHandler { 
    private _appLog: AppLog; 
    constructor (injector:Injector) { 
    setTimeout(() => this._appLog = injector.get(AppLog)); 
    } 
    ... 
} 

winkelförmigen Stangen DI selbst nur zu brechen unterstützt keine zyklischen Abhängigkeiten.

+0

Der Code innerhalb von setTimeout sollte eine Funktion sein - z. setTimeout (() => {this._appLog = injektor.get (AppLog)); }); –

+1

@CraigShearer vielen Dank - behoben. –

Verwandte Themen