有条件实现的Angular电子邮件验证程序不同步激发

有条件实现的Angular电子邮件验证程序不同步激发,angular,angular-forms,angular2-formbuilder,Angular,Angular Forms,Angular2 Formbuilder,我只想验证提供的电子邮件地址。据我所知,您可以通过订阅valueChanges函数并根据提供的逻辑附加验证器来实现这一点。但是,当我这样做时,验证程序不会在正确的时间启动。空字符串将被设置为无效,但单个字符将被标记为有效 我的示例代码来自模板: <form [formGroup]="formGroup"> Email: <input formControlName="email" type="text"> </form> 您可以在这里看到它的作用:文档中

我只想验证提供的电子邮件地址。据我所知,您可以通过订阅
valueChanges
函数并根据提供的逻辑附加验证器来实现这一点。但是,当我这样做时,验证程序不会在正确的时间启动。空字符串将被设置为无效,但单个字符将被标记为有效

我的示例代码来自模板:

<form [formGroup]="formGroup">
  Email: <input formControlName="email" type="text">
</form>
您可以在这里看到它的作用:

文档中说它将更新其祖先的有效性。在这种情况下,在父FormGroup上调用它似乎不会更新子电子邮件控件

解决方案应该是在电子邮件控件本身上调用
updateValue和validity
,但当这种情况发生时,它将导致
valueChanges
接收新值,这将导致无限循环。通过传递选项
{emitEvent:false}
它应该绕过
值更改
,并按预期的方式运行

this.formGroup.get('email').valueChanges.subscribe(value => {
  if (!this.formGroup.get('email').value) {
    this.formGroup.get('email').clearValidators();
  } else {
    this.formGroup.get('email').setValidators(Validators.email);
  }
  this.formGroup.get('email').updateValueAndValidity({emitEvent: false});
});

是否与此处报告的问题相同:
this.formGroup.get('email').valueChanges.subscribe(value => {
  if (!this.formGroup.get('email').value) {
    this.formGroup.get('email').clearValidators();
  } else {
    this.formGroup.get('email').setValidators(Validators.email);
  }
  this.formGroup.get('email').updateValueAndValidity({emitEvent: false});
});