formArray的角异步自定义验证器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了formArray的角异步自定义验证器相关的知识,希望对你有一定的参考价值。

嗨,我有一个表单,其中包含我正在使用formArray的数量的动态字段。用户可以生成多个金额字段。

我想要的是计算所有动态字段中的总计值,如果超出总数,则显示错误消息。

问题是,当我使用valuchange遍历formarray,然后返回对resolve的promise时,它仅显示第一个字段的验证错误。以下是堆叠闪电战。您可以在控制台中看到。当您键入超出总数的数字时,它将在第一个字段中显示错误。对于其余的,如果您超过总数,则不会显示错误。 https://stackblitz.com/edit/angular-sbidt3

答案

您不应该使用valueChanges。您实际上正在寻找的是跨表单验证。

阅读相关内容,例如:https://medium.com/@realTomaszKula/angular-cross-field-validation-d94e0d063b61https://angular.io/guide/form-validation

将验证者绑定到表单


编辑:

组件

  biddingForm: FormGroup;

  constructor( private _formBuilder: FormBuilder,)  

  ngOnInit() 
    this.biddingForm = this._formBuilder.group(
      bidding: this._formBuilder.array([]),
    ,  validator: this.amountValidator );

    this.addBet();
  

  addBet()
    this.bidding.push(
      this._formBuilder.control(0),
    );
  

  get bidding()
    return <FormArray>this.biddingForm.controls.bidding;
  

  amountValidator(fg: FormGroup) 
    const values: number[] = (fg.controls.bidding as FormArray).controls.map(
      (control: FormControl) => +control.value, 
    );

    const amount = values.reduce((sum, v) => sum + v, 0);

    return amount <= 50 ? null :  amount: true ;
  ;

模板

<form [formGroup]="biddingForm">
  <div formArrayName="bidding">
    <div class="col-75" *ngFor="let bet of bidding.controls; let i = index;">
        <input [formControlName]="i" type="text"  required > 
        <div *ngIf="biddingForm.hasError('amount')">
          Maxmimum amount reached
        </div>
      </div>
  </div>
  <button (click)="addBet()">Add</button>
</form>

以上是关于formArray的角异步自定义验证器的主要内容,如果未能解决你的问题,请参考以下文章

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

我们如何使用带有可自定义控件的 ngFor formArrays?

嵌套的自定义 FormArray 组件不与具有 FormArrayName 的子表单绑定

Angular 反应式表单自定义控件异步验证

淘汰赛验证多个自定义异步规则

带有自定义组件的角包裹角材料标签组件