微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

向FormArray提供除空数组以外的任何内容时,角度自定义验证器会中断

如何解决向FormArray提供除空数组以外的任何内容时,角度自定义验证器会中断

我有一个用于FormArray的自定义验证程序,只要FormArray的输入为[],验证程序就可以正常工作。但是,如果我为FormArray提供string[]FormControl[],则验证器将破坏整个角度应用程序,并导致无限循环错误

我真的不确定是什么导致了这种情况的发生。我需要能够使用元素实例化FormArray,所以我需要它来工作。

起初,我认为问题是由于我将string[]而不是FormControl[]传递给FormArray引起的,但是即使将数组映射到FormControls的数组后,我也得到了相同的结果问题。

this.alertData.alertContacts只是一个电子邮件字符串数组。

FormGroup实例化-工作

this.form = this.formBuilder.group({
      alertContacts: this.formBuilder.array([],[Validators.required,alertContactsArrayValidator()]),});

FormGroup实例化-损坏

this.form = this.formBuilder.group({
      alertContacts: this.formBuilder.array(this.alertData.alertContacts,});

FormGroup实例化-损坏

this.form = this.formBuilder.group({
      alertContacts: this.formBuilder.array(this.alertData.alertContacts.map(x => new FormControl(x)),});

自定义验证器

export function alertContactsArrayValidator(): ValidatorFn {
  return (c: AbstractControl): { [key: string]: any } | null => {
    let formArray = <FormArray>c;
    console.log(formArray);
    let hasEmailErrors = false;
    let formControls = formArray.controls;
    console.log(formControls);
    formControls.forEach(control => {
      let controlErrors: ValidationErrors = control.errors;
      console.log("Current control errors: ",controlErrors);
      Object.keys(controlErrors).forEach(key => {
        if (key === 'email') {
          hasEmailErrors = true;
          console.log("key has email");
        }
      });
    });
    return hasEmailErrors ? {'email': true} : null;
  };
}

解决方法

您需要检查control.errors是否为空。

formControls.forEach(control => {
      let controlErrors: ValidationErrors = control.errors;
      if (controlErrors){ //<---this "if"
        Object.keys(controlErrors).forEach(key => {
          if (key === 'email') {
            hasEmailErrors = true;
            console.log("key has email");
          }
        });
      }
    });

您还可以简化

formControls.forEach(control => {
   if (control.errors && control.errors.email){
        hasEmailErrors = true;
        console.log("key has email");
   }
});

formControls.forEach(control => {
   hasEmailErrors = hasEmailErrors ||
      (control.errors && control.errors.email)
   }
});

注意:我想你想做

this.form = this.formBuilder.group({
      alertContacts: this.formBuilder.array(this.alertData.alertContacts
       .map(x => new FormControl(x,[Validators.required,Validators.email])),[alertContactsArrayValidator()]),});

FormsControls具有必需的电子邮件验证器,而数组则是自定义验证器

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?