我如何在服务中发出一个字符串并进入组件

How can i emit a string in service and get in component

我想在 util.service.ts 处理一些错误时发出一个字符串,以便我可以在 app.component.ts 中获取此消息并显示它,但我无法订阅发射器。 这是我的代码,但它不起作用:

在util.service.ts中:

export class UtilService {
  errMsgEmitter = new EventEmitter();
  private handleError(error: Response | any) {
    let errMsg: string;
    if (error instanceof Response) {
      const body = error.json() || '';
      const err = body['error'] || JSON.stringify(body);
      errMsg = `${error['status']} - ${error['statusText'] || ''} ${err}`;
    } else {
      errMsg = error['message'] ? error['message'] : error.toString();
    }
    console.error(errMsg);
    this.errMsgEmitter.emit(errMsg);
    return Observable.throw(errMsg);
   }
  /**
   * get event emitter
   * @returns {EventEmitter<any>}
   */
  getNavChangeEmitter() {
    return this.errMsgEmitter;
  }

在 app.component.ts 我有这个:

ngOnInit() {
  this.utilService.getNavChangeEmitter()
   .subscribe(data => {
     this.errMsg = data;
   });
  }

有人可以帮助我吗?非常感谢

您可以使用 Subject 作为 Observable,如下所示。

import { Subject }    from 'rxjs/Subject';

export class UtilService {
  private message = = new Subject<string>();

  public errorMessage$ = this.message.asObservable();
  private error: string = '';

  private handleError(error: Response | any) {
    this.error = '';
    if (error instanceof Response) {
      const body = error.json() || '';
      const err = body['error'] || JSON.stringify(body);
      this.error = `${error['status']} - ${error['statusText'] || ''} ${err}`;
    } else {
      this.error = error['message'] ? error['message'] : error.toString();
    }
    console.error(this.error);
    this.message.next(this.error);
  }
}

// app.component.ts

ngOnInit() {
  this.utilService.errorMessage$.subscribe(error => {
    this.errMsg = error;
  });
}

突然我通过创建静态主题解决了这个问题:

util.service.ts:

static errSubject: BehaviorSubject<any> = new BehaviorSubject<any>('');

app.component.ts:

    UtilService.errSubject
      .subscribe(data => {
        this.errMsg = data;
      });

并且不要忘记在 app.module.ts

中提供 UtilService