2017-06-27 6 views
0

Ich habe Probleme, wenn Service in einen anderen Service injiziert wird. Ich habe einen ContactService erhalten, um Daten vom Server mit der Methode handleError zu erhalten. Ich habe einen AlertService bekommen, um einen Fehler von der handleError-Methode zu werfen. Ich habe contactService und AlertService bereits in meinem Core Module deklariert. Aber als ich alertService.submitNewMessage anrief, zeigte es, dass this.alertService nicht definiert ist. Bitte helfenProbleme beim Injekt-Service in anderem Service Angular 2

@Injectable() 
export class AlertService { 
    private $currentMessages: BehaviorSubject<string> = new BehaviorSubject(''); 
    public currentMessages: Observable<string> = this.$currentMessages.asObservable(); 
    constructor() { } 

    submitNewMessage(msg: string): void { 
    this.$currentMessages.next(msg); 
    } 

} 

Und Kontakt Service

@Injectable()  
export class ContactService { 


     private contactsUrl = 'http://localhost/customers'; 
     constructor(
        private http: Http, 
        private router: Router, 
        private alertService: AlertService 
       ) { } 

     getContactsFromService(): Observable<SubmitCustomerHttp[]> { 
     return this.http.get(this.contactsUrl) 
         .map(this.extractData) 
         .catch(this.handleError); 
     } 

     private extractData(res: Response) { 
     return HttpHelper.extractData(res); 
     } 

     handleError(error: Response | any) { 
     let errMsg: string; 
     console.log('Receive error: ', error); 
     if (error instanceof Response) { 
      const body = error.json() || ''; 
      const err = body.error || JSON.stringify(body); 
      errMsg = `${error.status} - ${error.statusText || ''} ${err}`; 
      if (error.status === 500 || 400 || 404) { 
      window.alert(errMsg); 
      this.alertService.submitNewMessage(errMsg); 
      return errMsg; 
      } 
     } else { 
      errMsg = error.message ? error.message : error.toString(); 
      console.log('Error Message: ', errMsg); 
      return null; 
     } 
     } 
    } 

Mein Core Module

@NgModule({ 
    imports: [ 
    CommonModule, 
    HttpModule, 
    JsonpModule 

    ], 
    declarations: [], 
    providers: [ 
    AlertService, 
    ContactService, 

    ] 
}) 


export class CoreModule { 
    static forRoot(): ModuleWithProviders { 
    return { 
     ngModule: CoreModule, 
     providers: [ 
     AlertService, 
     ContactService, 

     ] 
    }; 
    } 
} 
+0

wo ist der Code für Alert .submitNewMessage? – Sajeetharan

+0

@Sajeetharan Sorry, mein Fehler, ich werde es beheben – TheRemjx

+0

Sie Kontaktservice ist nicht mit @Injectable –

Antwort

1

Das Problem, das ich auf

Zusammenhang vermuten
return this.http.get(this.contactsUrl) 
       .map(this.extractData) 
       .catch(this.handleError); 

Dieser registriert die Klasse mich thods als Callbacks, was falsch ist, weil this nicht korrekt binden wird.

Sie können dieses Problem beheben, indem diese in Pfeil-Funktionen Verpackung, so dass this noch auf den Dienst und nicht auf die Callback-Funktion beziehen, wenn der Code innerhalb erreicht:

return this.http.get(data => this.contactsUrl(data)) 
       .map(data => this.extractData(data)) 
       .catch(data => this.handleError(data)); 
+0

dekoriert Ich habe wie Ihr Kommentar aber immer noch diese Nachricht geändert: eError: Kann Eigenschaft "submitNewMessage" von undefined – TheRemjx

+0

Hey, guy. Danke für Ihre Hilfe. Nach mehrmaligem Rebuild wurde 'dieser' Kontext behoben – TheRemjx

+0

Gib diesem Mann ein Bier !!! – megalucio