Mat-Table 数据源在应用于 Angular 中的嵌套网格时被覆盖
Mat-Table Data Source getting overridden when applied on nested grids in Angular
我在 Angular 中创建了一个 2 级嵌套 Mat-Table 网格,它可以在其中一次展开多行。在父网格的每一行上单击它调用 API 并加载内部网格的数据。
当我点击第一行时,它会按预期获取数据。
但是当我点击第二行时,它按预期获取了第二行的数据,但是第一内行的值也变得与第二行相同。第一行的数据源值被第二行覆盖。
我尝试使用 index
使 dataSource
成为 dataSource[i]
的数组,但我做不到。
我有 a working StackBlitz for my issue.
谁能帮我解决这个问题?提前致谢。
问题是每次调用 api 获取行的新数据时,内部 userDatasource 都会被覆盖。
这是解决方案之一:
每当您调用以获取内部数据源数据时,将数据分配给 element
getProjectDetails(element: any) {
//console.log(element);
this.tableService.getInnerData(element.Id).subscribe(res => {
if (res.length == 0) {
element['innerDatasource'] = new MatTableDataSource();
} else {
console.log(res);
element['innerDatasource'] = new MatTableDataSource(res);
}
});
}
然后在 html 中使用该值
<table mat-table [dataSource]="element.innerDatasource" multiTemplateDataRows matSort>
工作 stackblitz link:https://stackblitz.com/edit/angular-nested-mat-table-triplenested-bpvhfr?file=app%2Ftable-expandable-rows-example.html
补充 Drhasti 的答案,另一种选择是允许一次只显示一个“细节”。在这种情况下,您将 .html 更改为仅显示一个
为此,您可以声明一个变量“elementExpanded”
elementExpanded:any;
然后你改变 *ngIf
<div class="example-element-detail" [@detailExpand]="element==elementExpanded"
*ngIf="element==elementExpanded">
...
</div>
还有垫子行中的 (click)
<tr mat-row *matRowDef="let element; columns: columnsToDisplay;"
[class.example-element-row]="element.addresses?.length"
[class.example-expanded-row]="element==elementExpanded"
(click)="elementExpanded = elementExpanded==element?null:element">
</tr>
我在 Angular 中创建了一个 2 级嵌套 Mat-Table 网格,它可以在其中一次展开多行。在父网格的每一行上单击它调用 API 并加载内部网格的数据。
当我点击第一行时,它会按预期获取数据。
但是当我点击第二行时,它按预期获取了第二行的数据,但是第一内行的值也变得与第二行相同。第一行的数据源值被第二行覆盖。
我尝试使用 index
使 dataSource
成为 dataSource[i]
的数组,但我做不到。
我有 a working StackBlitz for my issue.
谁能帮我解决这个问题?提前致谢。
问题是每次调用 api 获取行的新数据时,内部 userDatasource 都会被覆盖。
这是解决方案之一: 每当您调用以获取内部数据源数据时,将数据分配给 element
getProjectDetails(element: any) {
//console.log(element);
this.tableService.getInnerData(element.Id).subscribe(res => {
if (res.length == 0) {
element['innerDatasource'] = new MatTableDataSource();
} else {
console.log(res);
element['innerDatasource'] = new MatTableDataSource(res);
}
});
}
然后在 html 中使用该值
<table mat-table [dataSource]="element.innerDatasource" multiTemplateDataRows matSort>
工作 stackblitz link:https://stackblitz.com/edit/angular-nested-mat-table-triplenested-bpvhfr?file=app%2Ftable-expandable-rows-example.html
补充 Drhasti 的答案,另一种选择是允许一次只显示一个“细节”。在这种情况下,您将 .html 更改为仅显示一个
为此,您可以声明一个变量“elementExpanded”
elementExpanded:any;
然后你改变 *ngIf
<div class="example-element-detail" [@detailExpand]="element==elementExpanded"
*ngIf="element==elementExpanded">
...
</div>
还有垫子行中的 (click)
<tr mat-row *matRowDef="let element; columns: columnsToDisplay;"
[class.example-element-row]="element.addresses?.length"
[class.example-expanded-row]="element==elementExpanded"
(click)="elementExpanded = elementExpanded==element?null:element">
</tr>