首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FormArray在FormArray中的角度问题

FormArray在FormArray中的角度问题
EN

Stack Overflow用户
提问于 2022-08-25 07:33:01
回答 3查看 79关注 0票数 1

我正在研究一个角度的动态形式。另一个数组中应该有一个数组。

但我的表单出现了问题,出现了以下错误:

无法找到带有path的控件:'gruppen -> 0 -> prueffolge‘我有这样的对象结构:

代码语言:javascript
复制
"pruefplanTemplate": {
  "gruppen": [
      "prueffolge": 100,
      "name": "test",
      "pruefungen": [
        "..": "",
        "..": ""
      ]
  ]
}

这是我的代码:组件:

代码语言:javascript
复制
import { Component, OnInit } from '@angular/core';
import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';

@Component({
  selector: 'app-pruefplan-template',
  templateUrl: './pruefplan-template.component.html',
  styleUrls: ['./pruefplan-template.component.scss']
})
export class PruefplanTemplateComponent implements OnInit {
  form = this.fb.group({
    gruppen: this.fb.array([
      new FormGroup({
        pruefungen: this.fb.array([])
      })
    ])
  });

  constructor(private fb: FormBuilder) { }

  ngOnInit(): void {
  }

  get gruppen() {
    return this.form.controls["gruppen"] as FormArray;
  }

  addPruefplanGruppe() {
    const gruppeForm = this.fb.group({
      prueffolge: [100, Validators.required],
      name: ['', Validators.required],
      pruefungen: [[]]
    });

    this.gruppen.push(gruppeForm);
  }

  deleteGruppe(gruppenIndex: number) {
    this.gruppen.removeAt(gruppenIndex);
  }

  getPruefung(index: number, control: any): AbstractControl[] {
    var pruefungen = control[index].controls;
    return pruefungen;
  }

  addPruefschritt(index: number, gruppe: any) {
    var formArray = gruppe.controls['pruefungen'] as FormArray;

    const pruefschrittForm = this.fb.group({
      beschreibung: ['', Validators.required],
      erledigt: [false, Validators.required],
      reaktion: ['', Validators.required],
      bemerkung: ['', Validators.required]
    });

    this.getPruefung(index, gruppe).push(pruefschrittForm);
  }
}

模板:

代码语言:javascript
复制
<h3>Prüfplan erstellen:</h3>
<p>{{this.gruppen.length}}</p>
<div class="add-lessons-form" [formGroup]="form">
    <ng-container formArrayName="gruppen">
        <ng-container *ngFor="let gruppeForm of gruppen.controls; let i = index">
            <div class="lesson-form-row" [formGroupName]="i">
                <mat-form-field appearance="fill">
                    <input matInput formControlName="prueffolge" placeholder="Prüffolge">
                </mat-form-field>
                <mat-form-field appearance="fill">
                    <input matInput formControlName="name" placeholder="Name">
                </mat-form-field>
                <mat-icon class="delete-btn" (click)="deleteGruppe(i)">delete_forever</mat-icon>

                <ng-container formArrayName="pruefungen">
                    <ng-container *ngFor="let pruefschritt of getPruefung(i, gruppeForm); let j = index">
                        <div class="pruefschritt-form-row" [formGroupName]="j">
                            <mat-form-field appearance="fill">
                                <input matInput formControlName="beschreibung" placeholder="Beschreibung">
                            </mat-form-field>
                            <mat-form-field appearance="fill">
                                <input matInput formControlName="erledigt" placeholder="Erledigt"> //TODO: Boolean
                            </mat-form-field>
                            <mat-form-field appearance="fill">
                                <input matInput formControlName="reaktion" placeholder="Reaktion">
                            </mat-form-field>
                            <mat-form-field appearance="fill">
                                <input matInput formControlName="bemerkung" placeholder="Bemerkung">
                            </mat-form-field>
                        </div>
                    </ng-container>
                </ng-container>
            </div>

            <button mat-mini-fab (click)="addPruefschritt(i, gruppeForm);">
                Prüfschritt
                <mat-icon class="add-course-btn">add</mat-icon>
            </button>
        </ng-container>
    </ng-container>

    <button mat-mini-fab (click)="addPruefplanGruppe();">
        Gruppe
        <mat-icon class="add-course-btn">add</mat-icon>
    </button>
</div>

型号:

代码语言:javascript
复制
export interface PruefplanTemplate {
    gruppen: Gruppe[];
}

export interface Gruppe {
    prueffolge: number;
    name: string;
    pruefungen: Pruefung[];
}

export interface Pruefung {
    beschreibung: string;
    erledigt: boolean;
    reaktion: string;
    bemerkung: string;
}

我希望有人比我有更多的FormArray经验!

谢谢你们!1:https://i.stack.imgur.com/hEAGL.png

EN

回答 3

Stack Overflow用户

发布于 2022-08-25 08:10:14

当我们使用FormArray时,总是使用"getter“来获得formArray。如果我们有一个formArray of FormArray,就不能使用带有索引的"getter“函数。

所以你有

代码语言:javascript
复制
get gruppen()
{
    return this.form.get("gruppen") as FormArray;
}

getPruefungen(index:number)
{
   return this.gruppen.at(index).get('pruefungen') as FromArray
}

现在是“一如既往”

代码语言:javascript
复制
<form [formGroup]="form">
  <div formArrayName="gruppen">
     <div *ngFor="let group of gruppen.controls;let i=index" [formGroupName]="i">
         <input formControlName="prueffolge">
         ....
 
         <!--see that it's the same constructor for the inner
             but use getPruefungen(i) -->
         <div formArrayName="pruefungen">
             <div *ngFor="let group of getPruefungen(i).controls;let j=index" 
                                                              [formGroupName]="j">
                <input formControlName="beschreibung">
                 ....
             </div>
         </div>
     </div>
  </div>
</form>
票数 1
EN

Stack Overflow用户

发布于 2022-08-25 08:10:22

更新:请查看@akotech评论

问题是,您需要将pruefungen定义为FormArray而不是ForControl,如下所示:

代码语言:javascript
复制
addPruefplanGruppe() {
    const gruppeForm = this.fb.group({
      prueffolge: [100, Validators.required],
      name: ['', Validators.required],
      pruefungen: this.fb.array([]).  // <---- see this line
    });

    this.gruppen.push(gruppeForm);
  }
票数 0
EN

Stack Overflow用户

发布于 2022-08-25 08:40:38

可以从formArray本地属性访问单个pruefungen formArray。

代码语言:javascript
复制
 <ng-container *ngFor="let pruefschritt of gruppeForm.get('pruefungen').controls;
    let j = index">
  ....
 </ng-container>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73483552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档