angular - 为材料表数据源创建动态接口
问题描述
我有一个通用组件,用于查看包含动态字段的查询结果。
我mat-table
用来查看数据,但分页和排序功能不起作用。
该函数setDataSource
是从父组件调用的。
我认为这是因为数据源声明没有实现接口。
如何使用动态接口设置数据源?
我的HTML:
<mat-table matTableExporter matSort #exporter="matTableExporter" [dataSource]="dataSource" class="mat-elevation-z8">
<ng-container *ngFor="let disCol of displayedColumns;let colIndex=index" matColumnDef="{{disCol}}">
<mat-header-cell *matHeaderCellDef mat-sort-header>{{disCol}} </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element[disCol]}} </mat-cell>
</ng-container>
<mat-header-row mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>
<mat-paginator [pageSizeOptions]="[5, 10, 50]" showFirstLastButtons></mat-paginator>
<button mat-raised-button (click)="exporter.exportTable('xlsx', {fileName:'report', sheet: 'sheet 1', Props: {Author: 'Me'}})">Excel</button>
打字稿:
displayedColumns: string[] = [];
dataSource: any = [];
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
@ViewChild(MatSort, {static: true}) sort: MatSort;
public setDataSource(data,column) {
this.displayedColumns = column;
this.dataSource = data;
this.dataSource.paginator = this.paginator;
this.dataSource.sort = this.sort;
}
解决方案
我有一个类似的问题,并通过每次数据更改时生成一个新的数据源然后设置分页器和排序器来解决它。
编辑:为分页器和排序器添加设置器并将static
属性更改为 false。setDataSource
在函数中设置分页器和排序器之前还要添加一个检查。
@ViewChild(MatPaginator, {static: false}) paginator: MatPaginator; // change static to false here
@ViewChild(MatPaginator, {static: false}) set matPaginator(value: MatPaginator) {
if(this.dataSource && value) {
this.dataSource.paginator = value;
}
}
@ViewChild(MatSort, {static: false}) sort: MatSort; // change static to false here
@ViewChild(MatSort, {static: false}) set matSort(value: MatSort) {
if(this.dataSource && value) {
this.dataSource.sort = value;
}
}
public setDataSource(data,columns) { // data -> array of elements; columns -> columns you wish to display
this.displayedColumns = columns;
this.dataSource = new MatTableDataSource<any>(data); // replace any with your data type
if(this.paginator) { // add check here
this.dataSource.paginator = this.paginator;
}
if(this.sort) { // add check here
this.dataSource.sort = this.sort;
}
}
推荐阅读
- mongodb - 左加入 mongodb 不起作用
- bash - 将逗号分隔的数字字符串解析为变量(脚本)bash
- python - AttributeError:“系列”对象没有属性“翻译”
- android - Daily Usagestats files somehow updating the file's name
- c++ - initialization order of thread local variables
- c - My BFS code is only showing the direct paths from source to destination, but not all possible paths
- c# - 向数据库添加记录失败
- jquery - 我可以在浏览器中禁用 JQuery 吗?
- c - Get name and version of OS
- html - How to change position of input parent div with radio button?