没有模型的角度材料表动态列

mev*_*aka 13 datasource interface dynamic angular-material

我需要使用没有模型的角度材料表,因为我不知道服务会是什么.

所以我初始化我MatTableDataSourcedisplayedColumns动态地在这样的组件:

TableComponent:

ngOnInit() {

this.vzfPuanTablo = [] //TABLE DATASOURCE

//GET SOMETHING FROM SERVICE 
this.listecidenKisi = this.listeciServis.listecidenKisi;
this.listecidenVazife = this.listeciServis.listecidenVazife;

//FILL TABLE DATASOURCE 
var obj = {};
for (let i in this.listecidenKisi ){
    for( let v of this.listecidenVazife[i].vazifeSonuclar){
        obj[v.name] = v.value;
    }
    this.vzfPuanTablo.push(obj);
    obj={};
}

//CREATE DISPLAYED COLUMNS DYNAMICALLY
this.displayedColumns = [];
for( let v in this.vzfPuanTablo[0]){
    this.displayedColumns.push(v);
}

//INITIALIZE MatTableDataSource
this.dataSource = new MatTableDataSource(this.vzfPuanTablo);
}
Run Code Online (Sandbox Code Playgroud)

代码中最重要的部分是:

for( let v in this.vzfPuanTablo[0]){
    this.displayedColumns.push(v);
}
Run Code Online (Sandbox Code Playgroud)

我在displayedColumns这里动态创建,这意味着; 即使我不知道服务会是什么,我可以在表格中显示.

例如displayedColumns可以是这样的:

  • ["一二三四五" ]

要么

  • [ "堆栈", "溢出", "帮助","我]

但这不是问题,因为我可以处理它.


但是当我想用HTML显示它时,我无法正确显示因为 matCellDef:

TableHtml:

    <mat-table #table [dataSource]="dataSource" class="mat-elevation-z8">

        <ng-container *ngFor="let disCol of displayedColumns; let colIndex = index" matColumnDef="{{disCol}}">
            <mat-header-cell *matHeaderCellDef>{{disCol}}</mat-header-cell>
            <mat-cell *matCellDef="let element "> {{element.disCol}}
            </mat-cell>
        </ng-container>

        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
        <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
    </mat-table>
Run Code Online (Sandbox Code Playgroud)

我的问题在这里:

<mat-cell*matCellDef ="let element"> {{element.disCol}} </ mat-cell>

事实上,我想element."disCol's value"在单元格中显示,但我不知道我该怎么做.

否则,除了这element."disCol's value"件事,一切都很好.


当我{{element.disCol}}用来显示时value of element that has disCols's value,所有单元格都是空的:

在此输入图像描述

{{element}}仅使用的其他示例:

在此输入图像描述


另外你可以看到:

  1. 表数据源正在动态变化.这意味着我不能轻易使用{{element.ColumnName}},因为我甚至不知道它是什么.

    • 第一个例子的displayedColumns = ['Vazife','AdSoyad','Kirmizi','Mavi','Yesil','Sari'];
    • 第二个例子的displayedColumns = ['Muhasebe','Ders','Egitim','Harici'];
  2. matHeaderCellDef 是正确的,因为它直接使用{{disCol}}.

但我需要阅读disCol的值,并element.(disCol's value)在单元格中显示.

我怎样才能做到这一点 ?

mev*_*aka 22

我找到了解决办法:)这是非常非常容易但我最初看不到:)只是这样:

        <mat-cell *matCellDef="let element "> {{element[disCol]}}
        </mat-cell>
Run Code Online (Sandbox Code Playgroud)

我必须{{element[disCol]}}只在HTML中使用.

现在,一切都好:)

  • 您能否向我发送完整的示例代码以从 API 创建动态列并填充网格 (2认同)

R.J*_*ert 12

我已尽力将动态表简化到最少。此示例将显示给定具有任意键的平面对象数组的任意列。请注意第一个对象如何具有额外的“foo”属性,该属性会导致创建整个列。DATA const 可能是您从服务获取的一些数据。另外,如果您知道一些将获得 JSON 的常见属性名称,您可以添加“列 ID -> 标签”映射到此。请参阅此处的斯塔赫闪电战。

import {Component, ViewChild, OnInit} from '@angular/core';

const DATA: any[] = [
  {position: 1, name: 'sdd', weight: 1.0079, symbol: 'H', foo: 'bar'},
  {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'},
  {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'},
  {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'},
  {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'},
  {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}
];

@Component({
  selector: 'dynamic-table-example',
  styleUrls: ['dynamic-table-example.css'],
  templateUrl: 'dynamic-table-example.html',
})
export class DynamicTableExample implements OnInit {

  columns:Array<any>
  displayedColumns:Array<any>
  dataSource:any
  
  ngOnInit() {
    // Get list of columns by gathering unique keys of objects found in DATA.
    const columns = DATA
      .reduce((columns, row) => {
        return [...columns, ...Object.keys(row)]
      }, [])
      .reduce((columns, column) => {
        return columns.includes(column)
          ? columns
          : [...columns, column]
      }, [])
    // Describe the columns for <mat-table>.
    this.columns = columns.map(column => {
      return { 
        columnDef: column,
        header: column,
        cell: (element: any) => `${element[column] ? element[column] : ``}`     
      }
    })
    this.displayedColumns = this.columns.map(c => c.columnDef);
    // Set the dataSource for <mat-table>.
    this.dataSource = DATA
  }
 
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 9

有关基于@mevaka 的完整工作示例

jobDetails$项目数组在哪里。

columns$等于Object.keys(jobDetails$[0])so 只是一个string[]

  <table mat-table [dataSource]="jobDetails$ | async">

    <ng-container *ngFor="let disCol of (columns$ | async); let colIndex = index" matColumnDef="{{disCol}}">
      <th mat-header-cell *matHeaderCellDef>{{disCol}}</th>
      <td mat-cell *matCellDef="let element">{{element[disCol]}}</td>
    </ng-container>


    <tr mat-header-row *matHeaderRowDef="(columns$ | async)"></tr>
    <tr mat-row *matRowDef="let row; columns: (columns$ | async)"></tr>
  </table>
Run Code Online (Sandbox Code Playgroud)