在表单数组 angular 中验证和显示特定表单控制器的错误消息

卫生

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormArray, Validators, ValidatorFn, AbstractControl } from '@angular/forms';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  myForm: FormGroup;

  constructor(private fb: FormBuilder) { }

  ngOnInit() {
    this.buildForm();
  }
  get vehicleGroup(): FormArray {
    return <FormArray>this.myForm.get('vehicleGroup');
  }

  buildForm(): void {
    this.myForm = this.fb.group({
      name: ['', Validators.required],
      vehicleGroup: this.fb.array([
        this.fb.group({
          vehicle: ['', Validators.required]
        })
      ], [Validators.required]),
    });
  }

  addVehicles(): void{
    const itemToAdd = this.fb.group({
      vehicle: ['', Validators.required]
    });
    this.vehicleGroup.push(itemToAdd);
  }
  deleteVehicle(i: number){
    this.vehicleGroup.removeAt(i);
  }

  save(): void{
    console.log('save');
  }
}
<form novalidate (ngSubmit)="save()" [formGroup]="myForm">

  <div class="form-group">
    <label for="name">Name</label>
    <input id="name" type="text" formControlName="name">
  </div>

	<div class="form-group">
		<label for="vehicle">Vehicle</label>
      <div formArrayName="vehicleGroup" *ngFor="let vehicle of vehicleGroup.controls; let i=index">
        <div class="form-group" [formGroupName]="i">
          <div>
            <input id="{{'vehicle'+i}}" type="text" formControlName="vehicle">
            <button type="button" (click)="deleteVehicle(i)"
              *ngIf="vehicleGroup.length >= 2">remove
            </button>                  
          </div>
        </div>
      </div>
      <div class="form-group">
      <button type="button" class="link-button" [disabled]="!vehicleGroup.valid" (click)="addVehicles()">
          + Add more vehicles
      </button>
      </div>
	</div> 
</form> 

我有这个(stackBlitz)简单的表单,用 angular 创建formBuilder

formArray如果该特定字段无效,我只需要了解如何验证动态的每个元素为每个元素显示唯一消息。我尝试了几种解决方案,并尝试custom validator function使用 return an ValidatorFn有了它,我可以简单地验证formArray,但它对我的场景来说还不够好,而且我仍然无法根据验证函数的行为显示消息。如何缩小范围,我只需要知道是否有更好的方法来验证 this 的每个动态元素formArray这些是验证规则。

  1. 每个字段值都应该是唯一的。
  2. 需要实时验证
  3. 添加几个元素后,有人编辑以前添加的字段,它也应该与所有其他字段值实时验证(这是我被击中的地方,我可以从编辑字段向上验证,但不是编辑字段下方的字段是相应验证)

如果有人可以向我展示某种以正确方式实现这一目标的方法,那就太好了,因为我已经对此感到震惊了将近 3 天,但仍然无法找到更好的解决方案。

斯里什蒂·坎德尔瓦尔

@rxweb/reactive-form-validators在我的项目中使用了唯一的验证器它可以直接在组件中使用,而无需创建任何自定义验证功能。

您可以按如下方式编辑 addVehicles 方法:

addVehicles(): void{
    const itemToAdd = this.fb.group({
      vehicle: ['', RxwebValidators.unique()]
    });
    this.vehicleGroup.push(itemToAdd);
  }

并添加

ReactiveFormConfig.set({"validationMessage":{"unique":"Enter unique value in the input"}});

到 ngOnInit。

这是分叉的stackblitz

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Angular 2表单数组验证

来自分类Dev

嵌套表单数组的Angular PatchValue

来自分类Dev

Angular 2+ 表单数组验证不起作用

来自分类Dev

Angular如何修补表单数组中的值

来自分类Dev

如何在HTML中访问Angular的表单数组?

来自分类Dev

innerHtml表单数组

来自分类Dev

Angular 8和表单数组错误无法找到路径为index的控件

来自分类Dev

angular 5 将值设置为嵌套表单组表单数组

来自分类Dev

控制器中的angular.js表单验证

来自分类Dev

PHP中的表单数组

来自分类Dev

Angular,将表单数据对象推入可观察数组并在 MatDataSource 中循环数据

来自分类Dev

从表单数组中获取表单内容

来自分类Dev

发布表单数组失败

来自分类Dev

等效类的表单数组

来自分类Dev

从表单数组获取角度

来自分类Dev

角度嵌套的表单数组

来自分类Dev

验证表单数组中的值

来自分类Dev

AngularJS验证表单数组长度

来自分类Dev

最终表单数组字段异步验证

来自分类Dev

数组中的Django表单数据

来自分类Dev

在Angular控制器中进行Restangular POST之前更改表单数据

来自分类Dev

将数组和表单数据发布到控制器-MVC Ajax

来自分类Dev

将数组和表单数据发布到控制器-MVC Ajax

来自分类Dev

Javascript获取表单数组值

来自分类Dev

表单数据未创建数组

来自分类Dev

无法获取表单数组值

来自分类Dev

Rails简单表单数组文本输入

来自分类Dev

HTML 表单数组提交模拟

来自分类Dev

自动填充输入表单数组