如何绑定angular动态表格?

How to bind angular dynamic form?

我在组件中有一个动态表单项。

  itemFormGroup = new FormGroup({
    x: new FormControl(4),
    y: new FormControl(1),
    z: new FormControl(0),
  });

  itemsForm = new FormGroup({
    items: new FormArray([
      this.itemFormGroup
    ])
  });

我想为输入文本绑定此行。

<table class="table table-borderless" [formGroup]="itemsForm">
    <thead>
      <tr>
        <th>x</th>
        <th>y</th>
        <th>z</th>
      </tr>
    </thead>
    <tbody formArrayName="items">
       <tr *ngFor="let item of items.controls; let i=index">
        <td><input type="text" class="form-control form-control-sm" [formControlName]="item.x"></td>
        <td><input type="text" class="form-control form-control-sm" [formControlName]="item.y"></td>
        <td><input type="text" class="form-control form-control-sm" [formControlName]="item.z" disabled></td>
      </tr>
    </tbody>
</table>

但这在浏览器上显示错误“编译失败”。

Error: src/app/app.component.html:40:43 - error TS2339: Property 'items' does not exist on type 'AppComponent'.

40            <tr *ngFor="let item of items.controls; let i=index">
                                         

Angular 正在您的组件实例中寻找 items 属性 但找不到。

您可以创建一个 getter 如:

get items() {
  return this.itemsForm.get('items') as FormArray;
}

然后将您的 ngFor 循环替换为以下内容:

<tr *ngFor="let item of items.controls; let i=index" [formGroupName]="i">
  <td><input type="text" class="form-control form-control-sm" formControlName="x"></td>
  <td><input type="text" class="form-control form-control-sm" formControlName="y"></td>
  <td><input type="text" class="form-control form-control-sm" formControlName="z" [disabled]="true"></td>
</tr>

注意:我添加了 [formGroupName]="i" 以缩小 Angular 形式的上下文,并将 [formControlName]="item.x" 替换为字符串 formControlName="x"

如果你不想使用类型化版本,你可以去掉组件中的 get items() 并只使用:

*ngFor="let item of $any(itemsForm.get('items')).controls; let i=index"