将地图对象(带有动态键和值)渲染到有角度的mat-table(列和行作为地图的键和值)中

时间:2019-08-22 18:01:30

标签: angular mat-table

我正在使用angular8作为前端和SpringBoot作为后端来开发POC。我的后端函数向我返回了具有动态键和值的Map对象列表(List < Map < String, Object > >)。 我需要在mat-dialog-content内部使用mat-table在前端角度使用此映射数组。我坚持将键和值定义为mat表的必需属性。请帮助我填充地图对象的动态列表(列标题为地图键,行为地图值)。

在下面发布了我的组件和html文件:

组件:

export class ProfileDialogComponent {
  username: String = "";
  mapArray: Map < String, Object > [] = [];
  constructor(private dialogRef: MatDialogRef < ProfileDialogComponent > ,
    @Inject(MAT_DIALOG_DATA) data, private userService: UserService) {
    this.username = data.username;
    this.userService.getImportedUserCareer(this.username).subscribe(data => {
      this.mapArray = data;
    });
  }
}

html:

<div>
  <mat-dialog-content *ngFor="let map of mapArray">
    <mat-table class="mat-elevation-z8" [dataSource]="map">

      <ng-container matColumnDef="column" *ngFor="let column of map | keyvalue">
        <mat-header-cell *matHeaderCellDef>{{column}}</mat-header-cell>
        <mat-cell *matCellDef="let element">{{element[column]}}</mat-cell>
      </ng-container>
      <mat-header-row *matHeaderRowDef="map"></mat-header-row>
      <mat-row *matRowDef="let row; columns: map"></mat-row>
    </mat-table>
  </mat-dialog-content>
</div>

目前,我收到以下错误:     错误:提供的列定义名称重复:“ column”。

我在组件中填充了映射数组,其中包含字符串和字符串值的映射。但是html中的实现逻辑并不完整,如果有人可以指导我如何在mat table中填充地图数据,那将真的很有帮助。

PS:我已经在mat-dialog-content中迭代了map数组,以便将每个map对象都存储在mat-table中,因此应该将map键和值填充为每个mat-table的列标题和每个行中的行mat-dialog-content。

下面是数据样本

[
  {
    "Test Matches": 320,
    "Runs": 17500,
    "High Score": 242,
    "Batting Avg": 65.42,
    "Wickets": 14,
    "Bowling Avg": 31.76,
    "Best Bowling": "1/34",
    "Catches": 173,
    "MoS": 25
  },
  {
    "ODI Matches": 150,
    "Runs": 15750,
    "High Score": 184,
    "Batting Avg": 62.75,
    "Catches": 173,
    "MoM": 54
  }
]

请帮助!

谢谢, 西哈德

1 个答案:

答案 0 :(得分:3)

以下模板应为您工作:

Realm studio

Stackblitz Example

请注意,为了获得更好的性能,您可以将<div *ngFor="let map of mapArray"> <mat-table class="mat-elevation-z8" [dataSource]="[map]"> <ng-container [matColumnDef]="column.key" *ngFor="let column of map | keyvalue"> <mat-header-cell *matHeaderCellDef>{{ column.key }}</mat-header-cell> <mat-cell *matCellDef="let element">{{ column.value }}</mat-cell> </ng-container> <mat-header-row *matHeaderRowDef="({}).constructor.keys(map)"></mat-header-row> <mat-row *matRowDef="let row; columns: ({}).constructor.keys(map)"></mat-row> </mat-table> </div> 替换为自己的自定义管道,例如({}).constructor.keys(map),其中管道为:

map | keys