【发布时间】:2019-11-21 20:17:17
【问题描述】:
我正在尝试在 Angular Material Table 中为每一行创建FormArray(这意味着我的表中有 6 行,我想创建 6 个表单数组,但它应该为每一行自动添加,没有类似的选项添加行)。我面临如下错误:
错误错误:找不到带有路径的控件:每行的'time_sheet_array -> 4',在创建表单数组后我想提交包含6个表单数组的整个表单,请帮助我解决这个问题,提前谢谢。
我已经创建了材料表并能够显示所有值。但我无法为每一行创建表单数组。
table.html:
<div>
<form [formGroup]="time_form">
<table mat-table [dataSource]="dataSource" formArrayName="time_sheet_array" class="mat-elevation-z8">
<!-- Position Column -->
<ng-container matColumnDef="DAYS">
<th mat-header-cell *matHeaderCellDef> DAYS </th>
<td mat-cell *matCellDef="let element;let i = index;" [formGroupName]="i">
<mat-form-field>
<input matInput type="text" formControlName="days" [value]="element.dayOfWeek">
</mat-form-field>
</td>
</ng-container>
<!-- Name Column -->
<ng-container matColumnDef="DATE">
<th mat-header-cell *matHeaderCellDef> DATE </th>
<td mat-cell *matCellDef="let element;let i = index;" [formGroupName]="i">
<mat-form-field>
<input matInput type="text" formControlName="date" [value]="element.dateOfDay">
</mat-form-field>
</td>
</ng-container>
<!-- Weight Column -->
<ng-container matColumnDef="HOURS">
<th mat-header-cell *matHeaderCellDef> HOURS </th>
<td mat-cell *matCellDef="let element;let i = index;" [formGroupName]="i">
<mat-form-field>
<input matInput formControlName="hours" [value]="element.hours" placeholder="HOURS">
</mat-form-field>
</td>
</ng-container>
<ng-container matColumnDef="ACTIVITIES">
<th mat-header-cell *matHeaderCellDef> ACTIVITIES </th>
<td mat-cell *matCellDef="let element;let i = index;" [formGroupName]="i">
<mat-form-field>
<input matInput formControlName="activities" [value]="element.activity" placeholder="ACTIVITIES">
</mat-form-field>
</td>
</ng-container>
<!-- Symbol Column -->
<ng-container matColumnDef="MODIFIED_BY">
<th mat-header-cell *matHeaderCellDef> MODIFIED-BY </th>
<td mat-cell *matCellDef="let element;let i = index;" [formGroupName]="i">
<mat-form-field>
<input matInput formControlName="modified_by" [value]="element.timesheetFilledByUserName" placeholder="ACTIVITIES">
</mat-form-field>
</td>
</ng-container>
<ng-container matColumnDef="TIME">
<th mat-header-cell *matHeaderCellDef> TIME </th>
<td mat-cell *matCellDef="let element;let i = index;" [formGroupName]="i">
<mat-form-field>
<input matInput formControlName="time" [value]="element.timesheetFilledByUserTime" placeholder="ACTIVITIES">
</mat-form-field>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
</table>
</form>
<br>
<div class="buttoncenter">
<button mat-raised-button type="submit" color="primary" class="button" (click)="save_timesheet(time_form.value)">SAVE TIMESHEET</button>
</div>
</div>
table.ts:
time_form: FormGroup;
private time_sheet_array: Array < any > = [];
response: user_timesheet[];
dataSource: MatTableDataSource < user_timesheet > ;
displayedColumns = ['DAYS', 'DATE', 'HOURS', 'ACTIVITIES', 'MODIFIED_BY', 'TIME'];
constructor(private _formBuilder: FormBuilder, private service: ServicesService) {}
ngOnInit() {
this.time_form = this._formBuilder.group({
time_sheet_array: this._formBuilder.array([
this._formBuilder.group({
days: [''],
date: [''],
hours: [''],
activities: [''],
modified_by: [''],
time: ['']
})
])
})
this.user_timesheet();
}
user_timesheet() {
this.service.user_timesheet(credentials).subscribe(
response => {
this.dataSource = response;
}
);
}
save_timesheet(value) {
console.log("timesheet values:::", value);
}
结果:->
实际上这是一种包含许多表单数组的时间表表单,我想通过角度材料表显示它,所以这对我来说很容易,并且字段应该是可编辑的。通过表格显示后,我想提交完整的表格。
【问题讨论】:
-
不使用formGroupName,直接使用formControl,见stackoverflow.com/questions/56566003/…中的例子。如果要添加列或行,stackoverflow.com/questions/56562871/…
-
是的,我通过了解决方案,但它是硬编码的。您正在手动创建每个表单数组,但我不想根据响应手动创建我想创建表单数组,根本没有逻辑。
-
表单数组的创建应该基于后端响应,假设响应包含7个数组,我必须在UI中创建7个表单数组。
-
在stackblitz.com/edit/… 中,我放了一些更“可扩展”的内容,是的,我对数据进行了硬编码。您需要将所有内容放在订阅功能下。但我不是很了解。我认为您想创建一个唯一的对象数组,而不是多个数组。 (注意你也可以在读取数据后创建变量displayColumns和displayedControls
-
我刚刚使用服务更新了代码
标签: javascript html css angular