Данные не отображаются в FormArray, когда я использую мат-входы

#angular #typescript #angular-reactive-forms

#угловые #машинописный текст #угловые реактивные формы

Вопрос:

Я интегрировал форму в свою мат-таблицу с помощью FormArray, и я хочу загрузить ее в данные мат-входов с помощью get. Проблема в том, что если я удалю функцию initItemRows(), тогда мое намерение сработает. Но я хочу, чтобы эта функция была учтена, потому что я также добавляю и удаляю строки в таблице вручную. Что мне нужно сделать, чтобы мои данные отображались в мат-входах?

Моя работа: https://stackblitz.com/edit/angular-mat-table-with-api-call-r38g6b?file=app/table-basic-example.html

Мой код:

 // Part in HTML where tds are filled
<td mat-cell *matCellDef="let row; let i = index;">
                <div formArrayName="rows" *ngIf="attributesWithFormControls.includes(column.attribute); else otherColumns">
                  <span id="edit-cell" [formGroupName]="i">
                      <mat-form-field id="edit-calc-input">
                        <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>

 
 // Array
 private testColumns: EditColumns[] = [
    { attribute: 'test1', name: 'First'},
    { attribute: 'test2', name: 'Second' },
    { attribute: 'test3', name: 'Third'}
  ];
// Form fields
  public attributesWithFormControls = ['test1', 'test2', 'test3'];

  ngOnInit(): void {

 // Form
    this.form = this.formBuilder.group({
      rows: this.formBuilder.array([this.initItemRows()])
    });
this.loadData();
}

 get formArr() {
    return this.calcBookingsForm.get('rows') as FormArray;
  }

  initItemRows() {
    return this.formBuilder.group({
      test1: [''], test2: [''], test3: ['']
    });
  }
 
  // Fill the table with data
  private loadData() {
this.service.getData().subscribe(
          (resp: any) => {
                 ....
              }
              // Definition of the FormRows
              const formRowsData = [];
              for (const attr of this.columns) {
                const columnData = rows.filter((d, rowIndex) => {
                  if (this.attributesWithFormControls.includes(attr)) {
                    if (!formRowsData[rowIndex]) {
                      formRowsData[rowIndex] = [];
                    }
                    // prepare row values for later use in form groups
                    formRowsData[rowIndex].push({ attr, value: d[attr] ? d[attr] : '' });
                  }
                  return d[attr] !== undefined amp;amp; d[attr] !== null;
                }).map((d) => {
                  return d[attr];
                });
                this.dataAttributesColumnFilter[attr] = _.uniq(columnData);
              }
              const test1FormArray = this.form.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);
              }
              this.dataSource.data = rows;
            } else {
              console.log('No data for this year!');
              this.dataSource.data = [];
            }
          },
          error => this.isLoading = false
        );
}
 

Комментарии:

1. Можете ли вы создать stackblitz вокруг этого?

2. stackblitz.com/edit/…