angular - Angular mat-table 显示每行中键值 json 的动态数据
问题描述
我有以下 json 并想在材质表中以角度呈现
var res = '[
{
"DynamicName": "xyz",
"DynamicLevel": "xyz",
"DynamicLevel": "xyz",
"DynamicLevel": "xyz",
"dynamic": "xyz"
},
{
"DynamicName": "xyz",
"DynamicLevel": "xyz",
"DynamicLevel": "xyz",
"DynamicLevel": "xyz",
"dynamic": "xyz"
},
{
"DynamicName": "xyz",
"DynamicLevel": "xyz",
"DynamicLevel": "xyz",
"DynamicLevel": "xyz",
"dynamic": "xyz"
}]';
在第二个响应中,这个 json 将如下所示
var res = '[
{
"DynamicCity": "xyz",
"DynamicCountry": "xyz",
"DynamicState": "xyz",
"DynamicRegion": "xyz",
"dynamic": "xyz"
},
{
"DynamicCity": "xyz",
"DynamicCountry": "xyz",
"DynamicState": "xyz",
"DynamicRegion": "xyz",
"dynamic": "xyz"
},
{
"DynamicCity": "xyz",
"DynamicCountry": "xyz",
"DynamicState": "xyz",
"DynamicRegion": "xyz",
"dynamic": "xyz"
}]';
这个数据需要在材料表中渲染我试过这样
// properties of the class
displayedColumns: string[];//columns should be create dynamically
dataSource = res;
<table mat-table [dataSource]="dataSource | keyvalue" class="mat-elevation-z8">
<ng-container matColumnDef="key">
<th mat-header-cell *matHeaderCellDef> {{element.key}}</th>
<td mat-cell *matCellDef="let element"> {{element.value}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
I need output like below
在这里,动态列意味着在每个 api 调用中,我们为该列名称获取不同的数据,因此每次 api 调用都会更改它,因此我无法将其绑定到材料表。请帮我解决将json数据绑定到材料表的问题。参考网址:-
解决方案
html
<div class="demo-button-container">
<button mat-raised-button (click)="addData()" class="demo-button">
Add data
</button>
<button
mat-raised-button
[disabled]="!dataSource.length"
(click)="removeData()"
class="demo-button">
Remove data
</button>
</div>
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8 demo-table">
<!-- Position Column -->
<ng-container [matColumnDef]="col" *ngFor="let col of displayedColumns">
<th mat-header-cell *matHeaderCellDef>
{{col}}
</th>
<td mat-cell *matCellDef="let element">
{{element[col]}}
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
ts
import {Component, ViewChild} from '@angular/core';
import {MatTable} from '@angular/material/table';
export interface dynElement {
DynamicName: string,
DynamicLevel_1: string,
DynamicLevel_2:string,
DynamicLevel_3:string,
dynamic:string
}
const ELEMENT_DATA: any [] = [
{
DynamicName: "xyz",
DynamicLevel_1: "xyz",
DynamicLevel_2: "xyz",
DynamicLevel_3: "xyz",
dynamic: "xyz"
},
{
DynamicName: "xyz",
DynamicLevel_1: "xyz",
DynamicLevel_2: "xyz",
DynamicLevel_3: "xyz",
dynamic: "xyz"
},
{
DynamicName: "xyz",
DynamicLevel_1: "xyz",
DynamicLevel_2: "xyz",
DynamicLevel_3: "xyz",
dynamic: "xyz"
},
{
DynamicName: "xyz",
DynamicLevel_1: "xyz",
DynamicLevel_2: "xyz",
DynamicLevel_3: "xyz",
dynamic: "xyz"
},
]
@Component({
selector: 'table-dynamic-array-data-example',
styleUrls: ['table-dynamic-array-data-example.css'],
templateUrl: 'table-dynamic-array-data-example.html',
})
export class TableDynamicArrayDataExample {
// your Object Key Object.keys(obj)
displayedColumns: string[] = [...Object.keys(ELEMENT_DATA[0])];
dataSource = [...ELEMENT_DATA]; // you can pass your data from backend here
@ViewChild(MatTable) table: MatTable<any>;
addData() {
const randomElementIndex = Math.floor(Math.random() * ELEMENT_DATA.length);
this.dataSource.push(ELEMENT_DATA[randomElementIndex]);
this.table.renderRows();
}
removeData() {
this.dataSource.pop();
this.table.renderRows();
}
}
stackblitz中的演示
推荐阅读
- c# - 在1gb文件c#中搜索和替换文本的有效方法
- sql - SQL Server Query - 如何逐行转置并将它们堆叠起来?
- java - var/task/org/springframework/cglib/core/NamingPolicy.class(权限被拒绝)”,“errorType”:“java.io.FileNotFoundException”
- java - 未使用 Java 代码段设置 Google Cloud 项目环境变量
- strace - strace 报告 x32 和 64 位模式
- sql - 在 SQL db 中存储扩展 ASCII 值时出现问题
- c# - 使用 c# 绕过 SSRS 的 Windows 身份验证
- java - QuickSort IndexOutOfBound 异常数组列表
- xamarin - Xamarin 表单获取网格项位置
- python - Pandas:为一列赋值,只要条件持续存在并且某个值出现在另一列中