【问题标题】:EventEmitter not emitted when called in subscribe在订阅中调用时未发出 EventEmitter
【发布时间】:2018-07-27 06:06:11
【问题描述】:

我尝试将表单从我的子组件传递给他的父组件。

儿童 TS:

@Output() submit: EventEmitter<FormGroup> = new EventEmitter();

updateStream(): void {
    const body = {some data};

    // If I put this.submit.emit(this.form) here it works

    this.apiGatewayService.verifyKeys(body).subscribe(
       (res) => {
        console.log('SUCCESS verify : ', res);
        this.submit.emit(this.form); // doesn't work
      },
      (error) => {
        console.log('ERROR verify : ', error);
        this.disableLoader.emit(); // doesn't work
      });
}

html:

<child (submit)="updateStream($event)"></child>

父 TS:

 updateStream(form: formGroup): void {
    console.log('UPDATE');
  }

我的所有发送到订阅都不起作用(未显示父组件中的 console.log)。但是在订阅之外它可以工作。

你有什么想法吗?

编辑

问题在于 this.apiGatewayService.verifyKeys(body) 行。这个调用完美地工作(正确的响应),但是发射不起作用。但是,如果我像这样模拟这个调用,它会起作用:

updateStreamOut(): void {
    this.test().subscribe(
      (res) => {
        console.log('SUCCESS verify : ', res);
        this.submit.emit(this.lambdaForm); // Works
      },
      (error) => {
        console.log('ERROR verify : ', error);
        this.verifyError = true;
        this.disableLoader.emit(); // Works
      }
    );
  }

  test(): Observable<any> {
    return Observable.of({ status: 'ok' });
  }

这里是我的函数 verifyKeys :

verifyKeys(body): Observable<any> {
    const result = Observable.fromPromise(
      this.client.externalVerifyPost({}, body, config.additionalParams)
    );

    return this.handleResult.dispatchResponse(result, false);
  }

HandleResult 服务:

 dispatchResponse(result: Observable<any>, enableSnackbar: boolean = true) {
    return result
      .catch((error) => {
        const exception = this.getException(error);

        this.apiResponse.errorsHandler(exception);
        return Observable.throw(exception);
      })
      .mergeMap((res) => {
        if (enableSnackbar) {
          this.apiResponse.successHandler(res);
        }
        return Observable.of(res.data);
      });
  }

也许它会给你更多的信息。

【问题讨论】:

  • 你确定 subscribe 处理程序被调用了吗?你能做一个演示吗?
  • 是的,console.log 进入订阅(成功或失败)正确显示。此外,对后端的请求也正确传递:/
  • @onedkr 此代码看起来正确并且应该可以工作。按照要求,您可以创建一个演示来展示该问题。
  • this.apiGatewayService.verifyKeys(body) 没有触发
  • 我编辑我的帖子。问题在于调用 apiGatewayService.verifyKeys(body),但我仍然不明白什么是不正确的

标签: angular typescript rxjs eventemitter


【解决方案1】:

我发现了我的错误。实际上,当 this.apiGatewayService.verifyKeys(body) 启动时,会显示一个加载器。

我的父 HTML 是这样构建的:

<div *ngIf="!loader">
    <child ...></child
</div>

<div *ngIf="loader>
    My loader
</div>

所以当我的加载器被显示时,我的组件被从 DOM 中删除,我的“提交”事件发射器被取消订阅。

为了防止这种情况,我使用 angular 属性 [hidden] 而不是 *ngIf。 [隐藏] 就像一个显示:无,并且不会从 DOM 中删除我的子组件。

【讨论】:

  • 我面临同样的问题(在订阅之前发出的事件,但随机不在订阅内),但是我的 DOM 元素不受任何限制。因此,欢迎提出任何建议!
猜你喜欢
  • 2016-09-26
  • 2022-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 2021-07-30
  • 2016-09-30
  • 2020-08-10
相关资源
最近更新 更多