2017-06-27 8 views
0

別のサービスにサービスを注入するときに問題が発生しました。 handleServiceがhandleErrorメソッドを使ってサーバーからデータを取得しました。 handleErrorメソッドからエラーをスローするAlertServiceがあります。 私は既にCoreServiceにcontactServiceとAlertServiceの両方を宣言しています。 しかし、alertService.submitNewMessageを呼び出すと、this.alertServiceが定義されていないことが示されました。 他のサービスのインジェクションサービスの問題点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); 
    } 

} 

を助けてくださいと連絡先サービス

@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; 
     } 
     } 
    } 

私のコアモジュール

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

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

    ] 
}) 


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

     ] 
    }; 
    } 
} 
+0

はどこalertServiceのコードです.smitmitNewMessage? eError:プロパティに未定義 – Sajeetharan

+0

@Sajeetharan申し訳ありませんが、私のミス、私はあなたが私はあなたのコメントのように変更されましたが、まだそのメッセージが@Injectable – TheRemjx

+0

それを修正します。ご協力いただきありがとうございます。何度か再構築した後、 'this' contextは修正されました –

答えて

1

私は

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

これに関連している疑いがある問題は、私のクラスを登録しますこれは不正確です。thisが正しくバインドされないためです。

コードが内部に到達したときthisはまだコールバック関数にサービスを参照しないように、あなたは、矢印の機能でこれらをラップすることによってこの問題を解決することができます

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

で飾られていませんcontactservice – TheRemjx

+0

ねえ、男の「submitNewMessage」を読み取ることができません – TheRemjx

+0

その人にビールをあげましょう! – megalucio