在 FormArray 上使用内置 Angular 验证器

Using built-in Angular Validators on a FormArray

我使用 FormBuilder 为一组电子邮件字段实例化了一个 FormArray。我给它分配了一组 Validator,其中包括自定义 Validator 和 Angular 的内置 Validators.email

this.formBuilder.array(
    [this.formBuilder.control('')], 
    Validators.compose([customValidator, Validators.email])
)

以这种方式分配 Validator 意味着 FormArray 作为 control 参数传递给验证器。我的自定义验证器可以调整为期望 FormArray,但 Validators.email 期望具有单个值的 FormControl

如何将 Angular 内置验证器与 FormArray 一起使用?

formbuild 数组方法指定 validatorOrOpts or asyncValidator 参数转到 运行 表单数组本身而不是数组的控件所以有两个解决方案

  1. 将验证器添加到它自己的控件中

       this.formBuilder.array(
        [this.formBuilder.control('',Validators.email)], 
        Validators.compose([customValidator])
    )
    
  2. 创建自定义验证器并在每个数组控件上触发 angular 验证器
function customArrayEmailValidator(formArray: FormArray) {
  if (formArray.length > 0) {
    for (let c of formArray.controls) {
      let state = Validators.email(c)
      if (state !== null) {
        return { emailInValid: state }
      }
    }
    return null;
  } else {
    return null;
  }
}

但是看起来还是和第一种方式一样

stackblitz demo

FormBuilder - Array