假设我有一个带有mat-sort-header
和matSort
的mat-table
来启用排序,并且带有[dataSource]="tableDetails"
。在我将数据提取到sampleData
中后,我用以下内容初始化该表:
this.tableDetails = new MatTableDataSource(this.sampleData);
我的样本数据如下,按默认顺序:
sampleData =
[
{'id':1, 'name':'item 1'},
{'id':2, 'name':'item 2'},
{'id':3, 'name':'item 3'}
]
我可以用this.tableDetails.data[0]
获得第一个项目。现在,如果我使用mat-sort-header
按降序对带有id
的表进行排序,则显示的第一个项目将是{'id':3, 'name':'item 3'}
,但this.tableDetails.data[0]
仍然返回{'id':1, 'name':'item 1'}
。我注意到mat-sort头不会改变数据源的原始顺序。你知道如何获得排序的订单吗?
在dataSource上,您有一个sortData方法,可以用来获取排序的表数据。
MatTableDataSource sortData方法
根据MatSort的状态获取数据数组的排序副本。在对筛选的数据进行更改后或从MatSort发出排序更改时调用。默认情况下,该函数检索活动排序及其方向,并通过使用sortingDataAccessor检索数据来比较数据。可以为数据排序的自定义实现重写。
this.dataSource.sortData(this.dataSource.data, this.dataSource.sort)
您可以在对表进行筛选排序后访问新位置或传递给新数组;
// let yourNewData = [ ... this.dataSource.filteredData]
ngAfterViewInit() {
this.dataSource.sort = this.sort;
console.log(this.dataSource.filteredData[0])
}
此处找到的解决方案:https://github.com/angular/components/issues/11670
this.dataSource.connect().subscribe(d => this.renderedData = d);
事实上,我所做的是(用新行顺序重新创建表(:
this.dataSource.connect().subscribe(data: any) => this.dataSource = new MatTableDataSource(data));