FormArray 字段的角度自定义验证(反应式表单)

Posted

技术标签:

【中文标题】FormArray 字段的角度自定义验证(反应式表单)【英文标题】:Angular custom validation for FormArray fields (Reactive Form) 【发布时间】:2022-01-02 12:57:53 【问题描述】:

我是 Angular 新手,想了解如何为 FormArray 执行自定义字段验证?

FormArray 是动态的,您可以在其中推送或删除 FormGroup 项。 FormGroup 由 field1、field2、field3 组成。如果任一字段不为空,则应使用 validators.required 设置其他字段。如果所有字段为空或已填充,则该表单将有效。

谢谢。

下面是代码示例:

formA!: FormGroup;

initializeForm(): void 
    this.formA = this.fb.group(
      item1: this.fb.array([this.createItem1()]),
      item2: this.fb.array([this.createItem2()]),
    );
  

createItem1(): FormGroup 
   return this.fb.group(
       field1: null,
       field2: null,
       field3: null,
   );

【问题讨论】:

【参考方案1】:

试试这个。

createItem1(): FormGroup 
  const fg = this.fb.group(
      field1: null,
      field2: null,
      field3: null,
  );
   
  const validatorFn = (control: AbstractControl):  [key: string]: any  | null => 
    const obj = fg.getRawValue();
     
    if (obj.field1 || obj.field2 || obj.field3) 
      return Validators.required(control);
    
     
    return null;
  ;
   
  for (const control of Object.values(fg.controls)) 
    control.setValidators(validatorFn);
  

  return fg;

您还需要在按键时为所有控件执行updateValueAndValidity()

【讨论】:

嗨,我在尝试此操作时在“fg.controls”遇到了以下问题。可以建议吗?类型 ' [key: string]: AbstractControl; ' 必须有一个返回 iterator.ts(2488) 的 '[Symbol.iterator]()' 方法 修正了我的答案。请再次检查。 您好,感谢您的帮助。我做了一些更改以适应我的用例,并添加了额外的条件以在不需要时清除验证器。总的来说,它最终会奏效。

以上是关于FormArray 字段的角度自定义验证(反应式表单)的主要内容,如果未能解决你的问题,请参考以下文章

无法以角度反应形式获得 FormArray 结构

为什么未在formarray自定义验证值更改中设置错误

formArray 中的可拖动 formGroups(反应式表单)

添加新元素时,角度更新现有 FormArray 元素的有效性

以角度6动态加载formarray中的多个下拉列表

为啥使用自定义全局验证器在角度材料 6 的 mat-form 字段中未显示 mat-error