Динамическое построение таблицы Mat на своей вкладке в angular

#angular #typescript #angular-material #mat-table

#angular #typescript #angular-материал #таблица mat

Вопрос:

Компонент (TS-файл) в моем компоненте Angular-

 const test_data1: any[] = [
{
    name: 'John',
    id: 1,
    dateOfBirth: new Date(),
    address: 'add1'
  },
  {
    name: 'Sarah',
    id: 2,
    dateOfBirth: new Date(),
    address: 'add2'
  }
];

const test_data2: any[] = [
{
    name: 'John',
    id: 1,
    department: 'dept 1,
    manager: 'mgr_john'
  },
  {
    name: 'Bob',
    id: 2,
    department: 'dept 2',
    manager: 'mgr_bob'
  }
];
public tabColumns: Array<any> = [];
public dataSource: Array<any> = [];
public displayedColumns: Array<any> = [];    

ngOnInit() {
  this.tabs = ['tab1', 'tab2']
  this.tabColumns[0] = this.displayedColumns[0] = ['name', 'dateOfBirth1', 'address1'];
  this.dataSource[0] = {};
  this.dataSource[0].data = test_data;
  this.tabColumns[1] = this.displayedColumns[1] = ['name', 'department', 'manager'];
  this.dataSource[1] = {};
  this.dataSource[1].data = test_data2;
  ...
}
 

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

HTML-код —

 <div>
    <mat-form-field style="width:100% !important">
        <input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Search">
    </mat-form-field>
</div>
<mat-tab *ngFor="let tab of tabs; let index = index" [label]="tab.name">                
   <table mat-table [dataSource]="dataSource[index]" matSort>
      <ng-container [matColumnDef]="col" *ngFor="let col of displayedColumns[index]">
         <th mat-header-cell *matHeaderCellDef> {{col | uppercase}} </th>
         <td mat-cell *matCellDef="let element"> {{element[col]}} </td>
      </ng-container>
                
      <tr mat-header-row *matHeaderRowDef="displayedColumns[index]"></tr>
      <tr mat-row *matRowDef="let row; columns: displayedColumns[index];"></tr>
   </table>
</mat-tab>
 

Код компонента (TS-файла) для сортировки и поиска —

 @ViewChild(MatSort, { static: false }) sort: MatSort;

ngAfterViewInit(): void {
  this.dataSource.foreach(source => {
     this.dataSource.sort = this.sort;
  });      
}

public doFilter = (value: string) => {
  this.dataSource.foreach(source => {
     this.dataSource.filter = value.trim();
  });
}
 

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

1. Не могли бы вы создать stackblitz для того же?

2. Можно ли указать мне правильное направление с тем, что я опубликовал?

3. В принципе, у меня есть несколько вкладок, на каждой вкладке есть таблица. И данные таблицы (включая столбцы) являются динамическими.

4. @PankajParkar потребовалось некоторое время, но я добавил проект stackblitz — stackblitz.com/edit /…