【问题标题】:Angular Reactive Forms form control valueChanges stops listening on errorAngular Reactive Forms 表单控件 valueChanges 停止侦听错误
【发布时间】:2019-08-17 17:58:05
【问题描述】:

我有一个注册表单,我在表单控件上使用valueChanges 侦听器,并调用 http 服务,如果该值已经存在,则该服务会发布到服务器,例如电子邮件和用户名。如果服务器上已经存在该值,则返回状态码 403。我通过向用户显示消息来捕获并处理此错误,但我的问题是valueChanges 侦听器停止侦听,因此如果我只是更改表单值,则此代码是空闲的。即使在错误发生后,我可以让听众继续吗?我应该以另一种方式处理吗?谢谢。

这是监听器代码:

    this.watchEmailSub = this.registerForm.controls.email.valueChanges.pipe(
      debounceTime(500),
      distinctUntilChanged(),
      switchMap(v =>
        this.regService.checkRegistrationValueExists('Email', v, this.registerForm.controls.email.valid)
      )
    ).subscribe(returnValue => {
        this.registerEmailError = null;
        console.log('returnValue.message = ', returnValue.message);
      },
      (error) => {
        console.warn('Error = ', error);
        this.registerEmailError = 'This email already exists';
      }
    );

HTTP 服务代码:

  checkRegistrationValueExists(type: string, value: string, formControlValid: boolean): Observable<any> {
    // Code removed here that defines checkValueExistsUrl & checkValueExistsBody
    if (formControlValid) {
      return this.http.post<string>(checkValueExistsUrl, checkValueExistsBody);
    }
    return of({ message: `${type} invalid` });
  }

【问题讨论】:

  • 观察者的行为方式。一旦他们遇到错误,他们就会停止倾听。

标签: angular rxjs angular-reactive-forms


【解决方案1】:

您可以使用 catchError 并吞下错误来防止这种情况发生:

this.watchEmailSub = this.registerForm.controls.email.valueChanges.pipe(
  debounceTime(500),
  distinctUntilChanged(),
  switchMap(v =>
    this.regService.checkRegistrationValueExists('Email', v, this.registerForm.controls.email.valid).pipe(
      catchError(error => {
        this.registerEmailError = 'This email already exists';
        return EMPTY;
      })
    )
  )
).subscribe(returnValue => {
    this.registerEmailError = null;
    console.log('returnValue.message = ', returnValue.message);
  },
  (error) => {
    console.warn('shouldn't be here');
  }
);

不应在此处抛出 IMO 403。 403 在任何情况下都是不合适的,因为 403 表示未经授权查看此信息,如果有任何错误,它将是 400。除此之外,这是一个专门检查可用性的 API 端点。错误代码表示出现问题。这里没有出错,它检查并成功返回了您的答案,是它存在或不它不存在。

【讨论】:

  • 谢谢 - 我也想知道 403 代码。如果没有返回错误代码并且只使用returnValue.message 值,我可以轻松处理这个问题。即使使用 catchError 运算符,valueChanges 侦听器似乎也不幸停止了。
  • 抱歉,catchError 放错了地方。需要在 switchMap 中捕获它
  • 另一个旁注......无论如何,这作为 asyncValidator 可能会更好。
  • 再次感谢。您的解决方案对我有用!我也会研究 asyncValidator 。我实际上将 formControl 验证状态传递给我的 http 服务,所以实际上如果 formControl 无效,那么就没有对服务器的 http 调用。 asyncValidator 可能是做同样事情的更干净的方式。
  • asyncValidators 总是在同步验证器之后运行,所以是的,它是内置的。
猜你喜欢
  • 2019-08-13
  • 1970-01-01
  • 2020-04-07
  • 2017-08-06
  • 2018-11-10
  • 2019-12-16
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多