Итерировать через dataSource в mat-table Angular

У меня проблема с итерациями через dataSource, где у меня есть данные для mat-table

   <div *ngFor = "let element of arrayMain" id = "{{element}}" class = "my_item">
      <div><span class = "skuska"><span class = "mat-subheading-2">{{element}}</span></span></div>
      <mat-table #table [dataSource] = "dataSource[1]" matSort>
        <ng-container matColumnDef = "{{column.id}}" *ngFor = "let column of columnNames">
          <mat-header-cell *matHeaderCellDef mat-sort-header > {{column.value}} </mat-header-cell>
          <mat-cell *matCellDef = "let element" [style.background] = "element[column.id].color"> <div class = "mat-cell-inner">{{element[column.id].name}}</div></mat-cell>

        </ng-container>

        M:<mat-header-row *matHeaderRowDef = "displayedColumns"></mat-header-row>
        <mat-row *matRowDef = "let row; columns: displayedColumns;"></mat-row>
      </mat-table>
    </div>

Строка с этими данными содержит проблему

<mat-table #table [dataSource] = "dataSource[1]" matSort>

Я могу изменить данные только тогда, когда я изменяю число внутри массива:

dataSource[0],dataSource[1]....,dataSource[n]

Я пытаюсь использовать * ng по причине

<mat-table *ngFor = "let calendars of dataSource" #table [dataSource] = "{{calendars}}" matSort>

но он отображает ошибку:

ng: Parser Error: Got interpolation ({{}}) where expression was expected at column 0 in [{{calendars}}] in @101:73

Заполняю dataSource в функции

for(identificator = 0; identificator < n; identificator++)
       createData(identificator) 

createData(identificator) {
   some code...
       .
       . 
       .
    this.dataSource[identificator] = new MatTableDataSource(testData);
    this.dataSource[identificator].sort = this.sort;

}

Как я могу это исправить? Любые идеи? Спасибо !

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
4
7 914
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте использовать index с ngFor, чтобы отслеживать ваши итерации. Надеюсь, это поможет.

<div *ngFor = "let element of arrayMain, let myIndex=index" id = "{{element}}" class = "my_item"> <div><span class = "skuska"><span class = "mat-subheading-2">{{element}}</span></span></div> <mat-table #table [dataSource] = "dataSource[myIndex]" matSort> <ng-container matColumnDef = "{{column.id}}" *ngFor = "let column of columnNames"> <mat-header-cell *matHeaderCellDef mat-sort-header > {{column.value}} </mat-header-cell> // your same code </div>

Другой способ перебора элементов dataSource:

  dataElement: DataElement[] = [
    {position: 1, name: 'Hy', weight: 1.0079, height: 3.33},
    {position: 2, name: 'He', weight: 4.0026, height: 4.21},
    {position: 3, name: 'Li', weight: 6.941, height: 10.1},
    {position: 4, name: 'Be', weight: 9.0122, height: 11},
    {position: 5, name: 'Bo', weight: 10.811, height: 85},
    {position: 6, name: 'Ca', weight: 12.0107, height: 8.5},
    {position: 7, name: 'Ni', weight: 14.0067, height: 85.1},
    {position: 8, name: 'Ox', weight: 15.9994, height: 0.85},
    {position: 9, name: 'Fl', weight: 18.9984, height: 123},
    {position: 10, name: 'Ne', weight: 2110.1797, height: 8}
  ];

  columns = [
    {columnDef: 'position', header: 'No.', cell: (element: DataElement) => `${element.position}`},
    {columnDef: 'name', header: 'Name', cell: (element: DataElement) => `${element.name}`},
    {columnDef: 'weight', header: 'Weight', cell: (element: DataElement) => `${element.weight}`},
    {columnDef: 'height', header: 'Height', cell: (element: DataElement) => `${element.height}`},
    {columnDef: 'result', header: 'Result', cell: (element: DataElement) => `${element.result}`}
  ];

  displayedColumns = this.columns.map(result => result.columnDef);

  dataSource = this.dataElement;

и, наконец, html:

<mat-table #table [dataSource] = "dataSource">
  <ng-container *ngFor = "let column of columns" [cdkColumnDef] = "column.columnDef">
    <mat-header-cell *cdkHeaderCellDef>{{ column.header }}</mat-header-cell>
    <mat-cell *cdkCellDef = "let row">{{ column.cell(row) }}</mat-cell>
  </ng-container>
  <mat-header-row *matHeaderRowDef = "displayedColumns"></mat-header-row>
  <mat-row *matRowDef = "let row; columns: displayedColumns"></mat-row>
</mat-table>

РЕПО: https://stackblitz.com/edit/angular-mat-table-create-dynamically

Другие вопросы по теме