【问题标题】:Bug when adding a new row in mat-table在 mat-table 中添加新行时出现错误
【发布时间】:2020-11-12 18:05:50
【问题描述】:

我想用一个按钮在 mat-table 中插入一个新行。我已经编写了一个函数,当我单击它时会插入一个新行,但我收到错误 CalculatoryBookingsComponent.html:62 ERROR Error: Cannot find control with path: 'rows -> 0' 并且只显示前 5 个单元格。你知道它是什么以及如何解决这个错误吗?

我的工作:https://stackblitz.com/edit/angular-l9x7ac?file=app%2Ftable-basic-example.html

代码:

// HTML

<button class="crud-status" type="submit" mat-raised-button (click)="addRow()">add</button>
<td mat-cell *matCellDef="let row; let i = index;">
                <div formArrayName="rows" *ngIf="attributesWithFormControls.includes(column.attribute); else otherColumns"> // Line 62: This is the area where the error code points to
                  <span class="edit-cell" [formGroupName]="i">
                      <mat-form-field>
                        <label>
                          <input matInput type="text" [formControlName]="column.attribute">
                        </label>
                      </mat-form-field>
                  </span>
                </div>
                <ng-template #otherColumns>
                  {{ column.object  !== null ? row[column.object][column.attribute] : row[column.attribute]  }}
                </ng-template>
              </td>

// TS

// ********** DATA TABLE ARRAYS **********//

  private beforeMonthsColumns: EditColumns[] = [
    { attribute: 'name', name: 'Erlöse / Kostenarten', object: null, disabledRanges: false, disabledAssignment: false },
    { attribute: 'kagNumber', name: 'KAG', object: null, disabledRanges: false, disabledAssignment: false }

  ];
  private monthColumns: EditColumns[] = [
    { attribute: '1', name: 'Jan', object: 'values', disabledRanges: false, disabledAssignment: false },
    { attribute: '2', name: 'Feb', object: 'values', disabledRanges: false, disabledAssignment: false },
    { attribute: '3', name: 'Mrz', object: 'values', disabledRanges: false, disabledAssignment: false }
  ];
  private afterMonthsColumns: EditColumns[] = [
    { attribute: 'note', name: 'Anmerkung', object: null, disabledRanges: false, disabledAssignment: false },
    { attribute: 'assignment', name: 'zugeordnet? KAG', object: null, disabledRanges: false, disabledAssignment: true }
  ];

  // Merged arrays
  public displayedColumns: EditColumns[] = [
    ...this.beforeMonthsColumns,
    ...this.monthColumns,
    ...this.afterMonthsColumns
  ];

 addRow() {
    this.dataSource.data.push(this.columns[this.index++])
    this.table.renderRows()
  }

 const formRowsData = [];
              const nameFormArray = this.calcBookingsForm.get('rows') as FormArray;
              // build form array values for text fields in data table rows
              for (const formRowDataEntry of formRowsData) {
                const consolidatedValues = {};
                // Combine rows values into one object
                for (const d of formRowDataEntry) {
                  consolidatedValues[d.attr] = d.value;
                }
                // bind values of one row to a form control group
                const rowGroup = this.formBuilder.group(consolidatedValues);
                nameFormArray.push(rowGroup);
                rowGroup.valueChanges.subscribe((rowData) => {
                  console.log('Row data changed:', rowData);
                });
              }
              this.dataSource.data = rows;

【问题讨论】:

  • 你能在 stackblitz 中重现它吗?
  • 我投入工作的那一刻
  • 我的工作:stackblitz.com/edit/… 如果你点击添加按钮,那么你会看到我的问题
  • 在控制台中显示另一个错误,至少,在那个堆栈闪电战中。
  • 我现在已经修复了控制台中的错误并使示例保持简单。但我仍然没有在表中看到新行。查看我的更新作品:stackblitz.com/edit/…

标签: angular typescript angular-material crud


【解决方案1】:

您应该将 FormArray 值与表 DataSource 中的数组同步:

ngOnInit() {
  ...
  this.myForm = this.formBuilder.group({
    rows: this.formBuilder.array([this.initItemRows()])
  }); 

  this.dataSource.data = this.myForm.get('rows').value;
}

addRow() {
  const newItem = this.initItemRows();
  this.formArr.push(newItem);

  this.dataSource.data = this.dataSource.data.concat(newItem.value);
}

Forked Stackblitz

【讨论】:

  • 我现在已经为模型、接口和数组添加了一些参数。不幸的是,插入新行时并非每个单元格都已填充,并且我在控制台中收到错误错误错误:找不到路径控制:'rows -> 0 -> kagNumber'。您有解决问题的方法吗?我的更新工作:stackblitz.com/edit/…
猜你喜欢
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多