Таблица Angular 7 и Angular Material с ошибкой источника данных при создании элемента управления формой выпадающего списка для каждой строки

На основе этого вопроса в стеке, мне нужно связать раскрывающийся список для каждой строки, созданной из угловой таблицы материалов dataSource. Выпадающий список должен автоматически выбрать соответствующее значение, как и другие значения.

Это таблица:

<form [formGroup]="formGroup">
    <table mat-table [dataSource]="dataSource" matSort>


      <!-- <ng-container matColumnDef="ind_id">
        <th mat-header-cell *matHeaderCellDef> Ind. ID </th>
        <td mat-cell *matCellDef="let element"> {{element.iid}} </td>
      </ng-container> -->


      <ng-container matColumnDef="name">
        <th mat-header-cell *matHeaderCellDef> Name </th>
        <td mat-cell *matCellDef="let element" [matTooltip]="element.iid" matTooltipPosition="left"> <b>{{element.far}} {{element.lar}}</b> </td>
        
      </ng-container>


      <ng-container matColumnDef="head_hh">
        <th mat-header-cell *matHeaderCellDef> Head Of HH </th>
        <td mat-cell *matCellDef="let element"> {{element.hhead}} </td>
      </ng-container>


      <ng-container matColumnDef="fr">
        <th mat-header-cell *matHeaderCellDef> Family Rel. </th>
        <td mat-cell *matCellDef="let element; let index = index;" [formGroupName]="index">
            <mat-form-field color="warn" appearance="outline">
                <mat-label>Family Relation</mat-label>
                <mat-select id="family_relation" formControlName="fr" placeholder="Family Relation">                 
                      <mat-option *ngFor="let familyRelation of familyRelationArray; let i = index" [value]="frid">
                    {{familyRelation.family_relation_type}}
                  </mat-option>
                </mat-select>
              </mat-form-field>&nbsp;
              {{element.fr}}
        </td>
      </ng-container>

      <ng-container matColumnDef="ms">
        <th mat-header-cell *matHeaderCellDef> Marital Sts. </th>
        <td mat-cell *matCellDef="let element"> {{element.ms}} </td>
      </ng-container>
      <ng-container matColumnDef="status">
        <th mat-header-cell *matHeaderCellDef> Status </th>
        <td mat-cell *matCellDef="let element"> {{element.sts}} </td>
      </ng-container>
      <ng-container matColumnDef="age">
        <th mat-header-cell *matHeaderCellDef mat-sort-header> Age </th>
        <td mat-cell *matCellDef="let element"> {{element.age}} </td>
      </ng-container>

      <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
      <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
    </table>
</form>

Вот код машинописного текста, в котором я генерирую FormArray на основе этого рабочего stackblitz из вопроса, прикрепленного выше:

constructor(private fb: FormBuilder, 
    private activatedRoute: ActivatedRoute, 
    private auth: AuthApiService) {
      this.formGroup = this.fb.group({
        'fr': this.createArray()
      })
}

Теперь для каждого formControl массива мне нужно привязать данные к выпадающему списку:

createArray(): FormArray{
    return new FormArray(this.dataSource.data.map(item=> new FormGroup({
      fr: new FormControl(item.frid)
    })));
}

Где frid - это value каждого выбранного варианта раскрывающегося списка, а fr - имя, отображаемое для пользователя.

У меня следующая ошибка:

[ts] Свойство 'frid' не существует для типа '{}'. [2339]

Вот фрагмент возвращенного массива:

0: {0: xyzzz, 1: xyz, 2: 57073, 3: 2, 4: Родитель, 5:

Женат, 6: активен, 7: нет,…}

0: xyz

1: zyz

2: 57073

3: 2

4: Родитель

5: женат

6: Активный

7: нет

8: 61

возраст: 61

далеко: xyz

fr: Родитель

пт: 2

hhead: нет

iid: 57073

lar: xyz

мс: женат

sts: Активный

Вот мой stackblitz.

Как сгенерировать контроль формы в каждой строке источника данных в таблице углового материала 6?


person alim1990    schedule 04.12.2018    source источник


Ответы (2)


Вы должны передать Type MatTableDataSource.

dataSource = new MatTableDataSource<any>(); //<-- any which accept all kind of classes.

ИЛИ: рекомендуемый

dataSource = new MatTableDataSource<Type>(); //<--- Type will be class or interface
person Sunil Singh    schedule 04.12.2018
comment
Новая ошибка после выполнения вашей 1-й рекомендации: HhHeadComponent.html:40 ERROR Error: Cannot find control with unspecified name attribute - person alim1990; 04.12.2018
comment
В строке 40 есть: <td mat-cell *matCellDef="let element; let i = index;" [formGroupName]="i"> - person alim1990; 04.12.2018
comment
Убрать [formGroupName]="index" из строки - person Sunil Singh; 04.12.2018
comment
Все тот же. вы можете получить доступ к моему коду с помощью teamviewer, если хотите. - person alim1990; 04.12.2018
comment
Было бы лучше, если бы вы могли создать демонстрацию stackblitz. - person Sunil Singh; 04.12.2018
comment
Это существует. Но я не знаю, почему он не импортирует мой appMaterialModule stackblitz.com/edit/angular-material -arxoij - person alim1990; 04.12.2018
comment
Сейчас он работает, проверьте его. stackblitz.com/edit/angular-material-arxoij - person alim1990; 04.12.2018

Или вы можете просто

createArray(): FormArray{
    return new FormArray(this.dataSource.data.map(item=> new FormGroup({
      fr: new FormControl(item['frid'])
    })));
}
person Satish Gupta    schedule 04.12.2018
comment
Мне вернули 9 строк, и я получил 9 сообщений об ошибках с надписью ERROR Error: Cannot find control with name: '0' и ту же ошибку для '1' до ERROR Error: Cannot find control with name: '8' - person alim1990; 04.12.2018
comment
Проверьте мой stackblitz stackblitz.com/edit/angular-material-arxoij - person alim1990; 04.12.2018