当你有一个矩阵时,你有一个 FormArray 的 FormArrays,例如如果您有类似的数据
export const data=[['uno','one'],['dos','two'],['tres','three']]
您可以像 (**) 一样格式化 FormArray 的 formArray
myformArray = new FormArray(
data.map(row=>new FormArray(
row.map(x=>new FormControl(x))
)))
当您使用 mat 表时,您需要一个“displayedColumns”,即一个包含您要显示的列的数组。如果你想要一个按钮“删除”,你可以使用另一个变量更多
displayedHeads: string[] = data[0].map((x,index)=>'col'+index);
displayedColumns: string[] = this.displayedHeads.concat('delete')
好吧,快准备好了,我添加了一个新变量 more 来指示您拥有的列数 - 这允许我们添加新行 - 以及使用 viewChild 的表格
columns: number = data[0].length;
@ViewChild(MatTable, { static: true }) table: MatTable<any>;
我们的桌子已经准备好展示了:
<button mat-button (click)="add()">Add row</button>
<table mat-table [dataSource]="myformArray.controls" class="mat-elevation-z8">
<!-- Name Column -->
<ng-container *ngFor="let head of displayedHeads;let j=index" [matColumnDef]="head">
<th mat-header-cell *matHeaderCellDef> {{head}} </th>
<td mat-cell *matCellDef="let element">
<input [formControl]="element.at(j)">
</td>
</ng-container>
<ng-container matColumnDef="delete">
<th mat-header-cell *matHeaderCellDef></th>
<td mat-cell *matCellDef="let element;let i=index;">
<button mat-button (click)="delete(i)">delete</button>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
看到dataSource是myformArray.controls,输入是[formControl]="element.at(j),是的“元素是内部formArray”
你可以看stackblitz(*)中的例子
我添加了两个函数来添加和删除行
delete(index: number) {
this.myformArray.removeAt(index);
this.table.renderRows()
}
add() {
const empty = [];
for (let i = 0; i < this.columns; i++)
empty.push(true)
this.myformArray.push(
new FormArray(empty.map(x => new FormControl('')))
)
this.table.renderRows()
}
(*) 在 stackblitz 中,我添加了一个指令以允许使用箭头键跨单元格移动
(**) 在您的情况下,您将表单格式设置为
myformArray = new FormArray(
data.map(row=>new FormArray(
row.map(x=>new FormControl(x.c))
)))