Angular 4数组验证

Jiř*_*bil 8 forms arrays validation angular angular-reactive-forms

我需要帮助以反应形式进行formArray验证.我想验证数组中的每个项目,但我不知道我该怎么做.谢谢.

HTML代码:

    <label for="name">name:</label>
    <input formControlName="name" id="name" type="text">
    <div *ngIf="name.invalid && (name.dirty || name.touched)">
       <div *ngIf="name.errors.required">
         required
       </div>
    </div>
Run Code Online (Sandbox Code Playgroud)

TypeScript代码:

 createForm() {
    this.form = this.fb.group({
      person: this.fb.array([this.initItemRows()])
    });
  }

initItemRows() {
    return this.fb.group({
      name: [''],
      info: ['']
    });
  }

  addNewRow() {
    const control = <FormArray>this.form.controls['person'];
    control.push(this.initItemRows());
  }

  deleteRow(index: number) {
    const control = <FormArray>this.form.controls['person'];
    control.removeAt(index);
  }

  get name() { return this.form.get('person.name'); }
  get info() { return this.form.get('person.info'); }
Run Code Online (Sandbox Code Playgroud)

我试过这个:

initItemRows() {
    return this.fb.group({
      name: ['', Validators.required ],
      info: ['', Validators.required ]
    });
  }
Run Code Online (Sandbox Code Playgroud)

它不起作用..

AJT*_*T82 17

您的干将nameinfo实际不针对具体的表单控件,因为你person是一个formArray,例如this.form.get('person.name');没有在您的形式存在.您需要做的是,对每个表单组使用迭代并使用其控件将该目标作为目标,因此您的模板应如下所示:

<div *ngFor="let p of form.controls.person.controls; let i = index" 
             [formGroupName]="i">
  <label for="name">name:</label>
  <input formControlName="name" id="name" type="text">
  <!-- check if the name in this group has the error -->
  <div *ngIf="p.controls.name.dirty">
    <div *ngIf="p.hasError('required', 'name')">Required</div>  
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

DEMO


另外一个建议是,你可以稍微缩短代码并删除一个初始化/添加formgroup到你的数组不需要的方法,所以在这里我删除了addNewRow,initItemRows当你想要添加一个新行时可以调用.

this.form = this.fb.group({
  person: this.fb.array([])
});
this.initItemRows();

initItemRows() {
  let ctrl = <FormArray>this.form.controls.person;
  ctrl.push(this.fb.group({
    name: ['', Validators.required],
    info: ['', Validators.required]      
  }))
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这应该在角度文档中 (3认同)