【问题标题】:Angular 4 array validationAngular 4 数组验证
【发布时间】:2018-03-26 18:52:16
【问题描述】:

我需要关于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>

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'); }

我试过了:

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

它不起作用..

【问题讨论】:

    标签: arrays forms angular validation angular-reactive-forms


    【解决方案1】:

    nameinfo 的getter 实际上并不针对特定的表单控件,因为您的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>
    

    DEMO


    还有一个建议是,您可以稍微缩短代码并删除初始化/将表单组添加到数组中并不真正需要的方法,所以在这里我删除了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]      
      }))
    }
    

    【讨论】:

    • 谢谢,这应该在角度文档中
    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多