angularモデルなしの材料テーブルを使用する必要があります。これは、サービスから何が得られるかわからないためです。
そのため、そのようなコンポーネントでMatTableDataSource
とdisplayedColumns
を動的に初期化しています:
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);
}
_
コードの最も重要な部分は次のとおりです。
_for( let v in this.vzfPuanTablo[0]){ this.displayedColumns.Push(v); }
_
ここで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>
_
私の問題はここにあります:
<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}}
_のみを使用する他の例:
また、ご覧のとおり:
テーブルデータソースは動的に変化しています。それは_{{element.ColumnName}}
_を簡単に使用できないことを意味します。何であるかさえわからないからです。
matHeaderCellDef
が正しいのは、{{disCol}}を直接使用しているためです。
しかし、disColの値を読み取り、セルにelement.(disCol's value)
を表示する必要があります。
どうすればそれができますか?
私は解決策を見つけました:)それは非常に簡単ですが、最初は見えませんでした:)そのようにのみ:
<mat-cell *matCellDef="let element "> {{element[disCol]}} </mat-cell>
{{element[disCol]}}
はHTMLでのみ使用する必要があります。
今、すべてが大丈夫です:)
@mevakaに基づく完全に機能する例
ここで、_jobDetails$
_はアイテムの配列です。
_columns$
_はObject.keys(jobDetails$[0])
と同等なので、ただ_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>
_