如何将自定义验证器添加到 FormArray? [英] How to add custom validator to a FormArray?

查看:33
本文介绍了如何将自定义验证器添加到 FormArray?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想向表单添加自定义验证器,以防止 mat-step 切换到下一步.当我使用 FormGroups 时一切正常,但当我必须使用 FormArray 时我无法实现验证.

I want to add custom validator to form in order to prevent mat-step switching to next step. All works well when I use FormGroups but I fail to achieve validation when I have to use FormArray.

我至少尝试了两种在表单初始化时分配验证器的变体:

I've tried at least two variants of assigning validator on form initialization:

  • 数组内部

状态:this._formBuilder.array([this.createStatus()], defaultStatusValidator())

  • 在数组的父窗体中

this.productionLineStatuses = this._formBuilder.group({statuses: this._formBuilder.array([this.createStatus()])},{validator: defaultStatusValidator()});

但是这种尝试导致错误(可能是在转换验证器时):

But this attempts are causing error (probably when casting validator):

TypeError: Cannot convert undefined or null to object 
    at Function.keys (<anonymous>)
    at FormGroup.validate [as validator] (default-status.directive.ts:6)
    at FormGroup._runValidator (forms.js:3438)
    at FormGroup.updateValueAndValidity (forms.js:3399)
    at new FormGroup (forms.js:4097)
    at FormBuilder.group (forms.js:7578)
    at CreateProductionLineComponent.ngOnInit (create-production-line.component.ts:31)

在以下情况下不会抛出错误,但验证器也不起作用.这是我的其余代码和我的自定义验证器:

In the following case error is not thrown, but validator is not working too. Here is rest of my code and my custom validator:

ngOnInit() {
    this.productionLineDetails = this._formBuilder.group({
      productType: ['', Validators.required],
      language: ['', Validators.required],
      name: ['', Validators.required],
      description: [''],
    });
    this.productionLineStatuses = this._formBuilder.group({
      statuses: this._formBuilder.array([
        this.createStatus()
      ])
    }, defaultStatusValidator());
    this.statuses = this.productionLineStatuses.get('statuses') as FormArray;
    this.statusError = false;
  }

验证器:

export function defaultStatusValidator(): ValidatorFn {
    return function validate (statuses: FormArray) {
    let defaultCounter = 0;
    Object.keys(statuses.value.controls).forEach(key => {
        const control = statuses.value.controls[key];

        if (control.value.default == true) {
            defaultCounter ++;
        }
      });
    return (defaultCounter > 1) ? {moreThanOneStatusIsDefault: true} : null;
    };
}

我应该如何正确地向 FormArray 添加验证器?

How should I properly add validator to FormArray?

推荐答案

你已经考虑过你的 FormArray 是 FormControls 的 FormArray 还是 FormGroups 的 FormArray,但问题是你如何迭代控件,

You has consider if your FormArray is a FormArray of FormControls or a FormArray of FormGroups, but the problem is how you iterate over the controls,

两者的简单例子

export function customValidateArray(): ValidatorFn {
    return (formArray:FormArray):{[key: string]: any} | null=>{
      let valid:boolean=true;
      formArray.controls.forEach((x:FormControl)=>{
          valid=valid && x.value=="a"
      })
      return valid?null:{error:'Not all a'}
    }
  };

export function customValidateArrayGroup(): ValidatorFn {
    return (formArray:FormArray):{[key: string]: any} | null=>{
      let valid:boolean=true;
      formArray.controls.forEach((x:FormGroup)=>{
          valid=valid && x.value.name=="a" 
      })
      return valid?null:{error:'Not all name are a'}
    }
  };

您可以在 stackblitz

注意:为了创建表单,我使用了 FormGroup、FormControl 和 FormArray 的构造函数,但您也可以使用 FormBuilder.

NOTE: To create the form, I use the constructor of FormGroup, FormControl and FormArray, but you can use FormBuilder too.

注意 2:不必将 FormArray 包含在 FormGroup 中

NOTE 2: it's not necesary enclose a FormArray in a FormGroup

这篇关于如何将自定义验证器添加到 FormArray?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆