2017-06-27 56 views
0

在另一服务中注入服务时遇到问题。 我得到了一个ContactService以使用handleError方法从服务器获取数据。 我得到一个AlertService从handleError方法抛出错误。 我已经在我的核心模块中声明了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代码.submitNewMessage? – Sajeetharan

+0

@Sajeetharan对不起,我的错误,我会修复它 – TheRemjx

+0

你contactservice没有用@Injectable装饰 –

回答

1

我怀疑是关系到

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

这个问题我注册类thods作为回调,这是不正确的,因为this将无法​​正确绑定。

您可以通过在箭头的功能包装这些解决这个问题,让this仍然会参考服务,而不是回调函数的代码时杀入内线:

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

我改变了你的评论,但仍然是这样的消息:eError:无法读取属性'submitNewMessage'undefined – TheRemjx

+0

嘿,伙计。谢谢你的帮助。经过多次重建之后,'这个'上下文已被修复 – TheRemjx

+0

给那个男人一个啤酒! – megalucio