【问题标题】:How to create form arrays inside the angular-material-table如何在 angular-material-table 中创建表单数组
【发布时间】: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


【解决方案1】:

如果你有一个 formArray 的 formgroup 它只是等于 array.controls 的 dataSource

this.dataSource = this.myformArray.controls;

每一列都有一个*matCellDef="let element",我们使用formControl="element.get('nameOfControl')"进行输入

例如对于具有属性“prop1”的 formGroup 的 formArray

myFormArray=FormArray([new FormGroup({
    prop1:new FormControl()
  })
])

桌子是这样的

<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
  <ng-container *matColumnDef="prop1">
    <th mat-header-cell *matHeaderCellDef> Name </th>
    <td mat-cell *matCellDef="let element">
       <input arrow-div [formControl]="element.get('prop1')">
       </td>
  </ng-container>
  ...
</table>

更新假设你有

user_timesheet() {
  this.service.user_timesheet(credentials).subscribe(
    response => {
        response.data.forEach(data => {
        const formGroup = new FormGroup({
          days:new FormControl(data.days),
          date:new FormControl(data.date),
          ...
        })
        (this.time_form.get('time_sheet_array') as FormArray).push(formGroup)
      })
      this.dataSource = (this.time_form.get('time_sheet_array') as FormArray).controls;
    }
  );
}

【讨论】:

    猜你喜欢
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2018-03-26
    相关资源
    最近更新 更多