2017-01-11 7 views
8

मैं निम्नलिखित कोड है:कस्टम ErrorHandler में Angular2 इंजेक्शन सेवाओं

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) 
    } 
} 

हालांकि, जब मेरे ऐप बूटस्ट्रैप, यह अगर मैं निम्न त्रुटि के साथ MyErrorHandler में एक इंजेक्शन है विफल रहता है:

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

अगर मैं constructor (private _appLog: AppLog) {} निकालूँ और फिर handleError में कुछ और यह सिर्फ ठीक काम करता है और ErrorHandler है बुलाया।

मुझे लगता है कि यह AppLog और MyErrorHandler के रूप में काम नहीं करता है एक ही समय में instantiated कर रहे हैं

उत्तर

8

आप डि साथ चक्रीय निर्भरता को हटाने का इस समाधान का उपयोग कर सकते हैं

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

Angulars डि ही बस चक्रीय निर्भरताओं का समर्थन नहीं करता है।

+0

setTimeout के अंदर कोड एक फ़ंक्शन होना चाहिए - उदा। setTimeout (() => {this._appLog = injector.get (AppLog)); }); –

+1

@CraigShearer बहुत बहुत धन्यवाद - तय। –

संबंधित मुद्दे