【问题标题】:Trouble in Inject Service in Other Service Angular 2在其他服务Angular 2中注入服务的问题
【发布时间】:2017-06-27 19:16:03
【问题描述】:

在另一个服务中注入服务时遇到问题。 我有一个 ContactService 使用 handleError 方法从服务器获取数据。 我有一个 AlertService 从 handleError 方法抛出错误。 我已经在我的核心模块中声明了contactService 和AlertService。 但是当我调用 alertService.submitNewMessage 时,它​​显示 this.alertService 是未定义的。 请帮忙

@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,

      ]
    };
  }
}

【问题讨论】:

  • alertService.submitNewMessage 的代码在哪里?
  • @Sajeetharan 对不起,我的错误,我会改正的
  • 你的contactservice没有用@Injectable修饰

标签: angular typescript angular2-services


【解决方案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));

【讨论】:

  • 我已经像你的评论一样改变了,但仍然是那个消息:eError: Cannot read property 'submitNewMessage' of undefined
  • 嘿,伙计。谢谢你的帮助。多次重建后,“this”上下文已修复
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多