角度自定义验证器未将FormArray标记为无效

时间:2020-01-16 22:11:29

标签: angular

下面的自定义百分比验证器将受益者数组作为参数。受益人表单是使用planPercents构建的,其中百分数作为formConrol。控制台日志适用于分布超过100%的任何计划。但是,我无法成功返回无效值并将formArray标记为无效。

beneficiaries: this.fb.array([], PercentValidator.beneficiaryDistValidator),  

    getPlanPercentGroup(): FormGroup {
        return this.fb.group({
          planUnitId: [null, Validators.required],
          percent: [0, Validators.required],
        });
      }


        import {FormArray} from '@angular/forms';

            export class PercentValidator {

              static beneficiaryDistValidator(formArray: FormArray): ValidationResult {
                if (formArray.controls.length) {
                  // if there is at least one beneficiary
                  const planPercentArray = formArray.at(0).get('planPercents') as FormArray;
                  if (planPercentArray && planPercentArray.controls.length) {
                    for (let i = 0; i < planPercentArray.controls.length; i++) {
                      let planPercentCounter = 0;
                      formArray.controls.forEach(beneficiary => {
                        const planPercentArray2 = beneficiary.get('planPercents') as FormArray;
                        planPercentCounter += planPercentArray2.at(i).get('percent').value;
                        if (planPercentCounter > 100) {
                          console.log('Invalid');
                          return {Invalid: true};
                        }
                      });
                    }
                  }
                }
                return null;
              }
            }

            export interface ValidationResult {
              [key: string]: boolean;
            }

1 个答案:

答案 0 :(得分:1)

那是因为您正试图从forEach回调内部返回。您必须在回调的外部中定义一个变量,然后从内部进行分配。然后您就可以return了。