尝试在包含另一个对象的对象上使用 Angular Material table
Trying to use Angular Material table on object that contains another object
所以基本上我在 Angular 中定义了一个接口,看起来像这样:
export interface product {
brand: String,
type: String,
value: number,
fields: Rating[]
}
字段 属性 是一个评级对象数组,关键是用户可以向字段 属性 添加许多评级。问题是我不知道如何从本质上将这个对象展平到 table 上,以便所有字段都显示为另一列。
brand type value field1 field2 field3
row1
row2
目前我有 html 模板遍历产品对象,尽管当您点击字段时它会按照您的想法进行操作并为您提供 [Object object]、[Object object] 列.有没有一种方法可以在我当前的循环中有另一个嵌套循环……或者类似的东西。当前 table 代码如下所示。
<mat-table [dataSource]="data">
<ng-container *ngFor="let col of columns" matColumnDef="{{col}}">
<mat-header-cell *matHeaderCellDef>{{ col }}</mat-header-cell>
<mat-cell *matCellDef="let element">
{{ element[col] }}
</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="columns"></mat-header-row>
<mat-row *matRowDef="let row; columns: columns;"></mat-row>
</mat-table>
如有任何帮助,我们将不胜感激。
根据您希望如何在 table 中查看结果,您必须在将数据发送到 table 之前对其进行操作。
如果您不能确定总会有 3 个字段,您可能需要重新考虑您的设计,以便为每一行重复其原始数据。
对于这种情况,您可能会寻找这样的东西:
let newlist=[];
fetchdata.subscribe(results=>{
results.foreach(r=>{
newlist.push({
brand: r.brand,
type: r.type,
value: r.value,
fields1: r.rating[0],
fields2: r.rating[1],
fields3: r.rating[2]
});
})
})
<mat-table [dataSource]="newlist">
LotteLemmens 在您的服务中使用管道映射的相同想法:
this.httpClient.get(...).pipe(map(data:any[]=>{
return data.map(r=>({
brand: r.brand,
type: r.type,
value: r.value,
fields1: r.rating[0],
fields2: r.rating[1],
fields3: r.rating[2]
}))
}))
另一个想法是简单地使用 {{col.indexOf('fields')>0?element[col][+col[6]-1]:element[col]}}
(*)
<ng-container *ngFor="let col of columns" matColumnDef="{{col}}">
<mat-header-cell *matHeaderCellDef>{{ col }}</mat-header-cell>
<mat-cell *matCellDef="let element">
{{col.indexOf('fields')>=0?element[col][+col[6]-1]:element[col]}}
</mat-cell>
</ng-container>
(*) 当我们在字符串上使用 variable[4]
获取第 5 位的字符时,我们转换为数字(添加 +
并减去 1)-通常我们的字段更喜欢 fields0 , fields1 和 fields2 避免了“减去”,但是我们选的是.
另一种方法是使用变量 columnsWihoutFields
columnsWihoutFields="brand,type,value"
并做两个循环:
<!--loop over columnsWithoutFields-->
<ng-container *ngFor="let col of columnsWihoutFields" matColumnDef="{{col}}">
<mat-header-cell *matHeaderCellDef>{{ col }}</mat-header-cell>
<mat-cell *matCellDef="let element">
{{ element[col] }}
</mat-cell>
</ng-container>
<!--loops to show the fields-->
<ng-container *ngFor="let col of [1,2,3]" matColumnDef="{{'fields'+col}}">
<mat-header-cell *matHeaderCellDef>{{ 'fields'+col}}</mat-header-cell>
<mat-cell *matCellDef="let element">
{{ element.ratting[col] }}
</mat-cell>
</ng-container>
注意:我想您的列是“brand,type,value,field1,field2,field3”
所以基本上我在 Angular 中定义了一个接口,看起来像这样:
export interface product {
brand: String,
type: String,
value: number,
fields: Rating[]
}
字段 属性 是一个评级对象数组,关键是用户可以向字段 属性 添加许多评级。问题是我不知道如何从本质上将这个对象展平到 table 上,以便所有字段都显示为另一列。
brand type value field1 field2 field3
row1
row2
目前我有 html 模板遍历产品对象,尽管当您点击字段时它会按照您的想法进行操作并为您提供 [Object object]、[Object object] 列.有没有一种方法可以在我当前的循环中有另一个嵌套循环……或者类似的东西。当前 table 代码如下所示。
<mat-table [dataSource]="data">
<ng-container *ngFor="let col of columns" matColumnDef="{{col}}">
<mat-header-cell *matHeaderCellDef>{{ col }}</mat-header-cell>
<mat-cell *matCellDef="let element">
{{ element[col] }}
</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="columns"></mat-header-row>
<mat-row *matRowDef="let row; columns: columns;"></mat-row>
</mat-table>
如有任何帮助,我们将不胜感激。
根据您希望如何在 table 中查看结果,您必须在将数据发送到 table 之前对其进行操作。 如果您不能确定总会有 3 个字段,您可能需要重新考虑您的设计,以便为每一行重复其原始数据。
对于这种情况,您可能会寻找这样的东西:
let newlist=[];
fetchdata.subscribe(results=>{
results.foreach(r=>{
newlist.push({
brand: r.brand,
type: r.type,
value: r.value,
fields1: r.rating[0],
fields2: r.rating[1],
fields3: r.rating[2]
});
})
})
<mat-table [dataSource]="newlist">
LotteLemmens 在您的服务中使用管道映射的相同想法:
this.httpClient.get(...).pipe(map(data:any[]=>{
return data.map(r=>({
brand: r.brand,
type: r.type,
value: r.value,
fields1: r.rating[0],
fields2: r.rating[1],
fields3: r.rating[2]
}))
}))
另一个想法是简单地使用 {{col.indexOf('fields')>0?element[col][+col[6]-1]:element[col]}}
(*)
<ng-container *ngFor="let col of columns" matColumnDef="{{col}}">
<mat-header-cell *matHeaderCellDef>{{ col }}</mat-header-cell>
<mat-cell *matCellDef="let element">
{{col.indexOf('fields')>=0?element[col][+col[6]-1]:element[col]}}
</mat-cell>
</ng-container>
(*) 当我们在字符串上使用 variable[4]
获取第 5 位的字符时,我们转换为数字(添加 +
并减去 1)-通常我们的字段更喜欢 fields0 , fields1 和 fields2 避免了“减去”,但是我们选的是.
另一种方法是使用变量 columnsWihoutFields
columnsWihoutFields="brand,type,value"
并做两个循环:
<!--loop over columnsWithoutFields-->
<ng-container *ngFor="let col of columnsWihoutFields" matColumnDef="{{col}}">
<mat-header-cell *matHeaderCellDef>{{ col }}</mat-header-cell>
<mat-cell *matCellDef="let element">
{{ element[col] }}
</mat-cell>
</ng-container>
<!--loops to show the fields-->
<ng-container *ngFor="let col of [1,2,3]" matColumnDef="{{'fields'+col}}">
<mat-header-cell *matHeaderCellDef>{{ 'fields'+col}}</mat-header-cell>
<mat-cell *matCellDef="let element">
{{ element.ratting[col] }}
</mat-cell>
</ng-container>
注意:我想您的列是“brand,type,value,field1,field2,field3”