mat-sort 以空值升序到最后
mat-sort ascending with null values to last
我有一个带有日期的 mat-sort-header。我想根据日期对 table 数据进行升序排序
,但希望最后显示空日期。问题是当我按升序排序时,首先显示空日期。
<table mat-table [dataSource]="dataSource" class="list-table list-table"
matSort matSortActive="due_date" matSortDirection="asc" matSortDisableClear>
<ng-container matColumnDef="due_date">
<th mat-header-cell *matHeaderCellDef mat-sort-header>{{ "DUE DATE" | translate }}</th>
<td mat-cell *matCellDef="let element">
<span *ngIf="element?.due_date!==null">{{ element.due_date | dateTranslation }}</span>
<span *ngIf="element?.due_date==null">{{'NO DUE DATE'|translate}}</span>
</td>
</ng-container>
按升序排序时显示空值的选项有哪些?
我的解决方案是,进行自定义排序并挂接到 ngAfterViewInit:
ngAfterViewInit() {
this.dataSource.sortData = (data, sort: MatSort) => {
let sortedData = [];
sortedData = data.sort((a, b) => {
const direction = this.getSortingOrder(sort.direction, a, b);
if (!direction[0][sort.active] || !direction[1][sort.active]) {
return sort.direction === "asc" ? 0 : -1;
} else {
return direction[0][sort.active]
.toString()
.localeCompare(direction[1][sort.active]);
}
});
return sortedData;
};
}
getSortingOrder = (order, a, b) => {
const sorted = order === "asc" ? [a, b] : [b, a];
return sorted;
}
这将在按升序排序时将空值推到最后
我有一个类似的问题,即“当单击排序按钮时忽略空值,因此它们总是打印在 table 的末尾”。
我是这样解决问题的:
- 覆盖 MatTableDataSource 的 sortingDataAccessor 方法
- 检查项目属性值
- 如果值为空,则检查排序顺序
- 根据排序顺序:返回(可能的)最高/最低值,以便具有空值的行始终位于 table 的末尾(在您的情况下,您将反转返回值) .
这是一个代码示例:
this.rankingData = new MatTableDataSource();
this.rankingData.sortingDataAccessor = (item, property) => {
if(null == item[property]) {
if("desc" == this.sort.direction) return '\u0000'+'\u0000'+'\u0000';
return '\uFFFF'+'\uFFFF'+'\uFFFF';
}
return item[property];
};
简短的解决方案!如果value为null可以加一个unreal big number,所以肯定把这个item放在最下面
this.dataSource.sortingDataAccessor = (item, property) => {
return item[property] || 9999999999999;
};
我有一个带有日期的 mat-sort-header。我想根据日期对 table 数据进行升序排序 ,但希望最后显示空日期。问题是当我按升序排序时,首先显示空日期。
<table mat-table [dataSource]="dataSource" class="list-table list-table"
matSort matSortActive="due_date" matSortDirection="asc" matSortDisableClear>
<ng-container matColumnDef="due_date">
<th mat-header-cell *matHeaderCellDef mat-sort-header>{{ "DUE DATE" | translate }}</th>
<td mat-cell *matCellDef="let element">
<span *ngIf="element?.due_date!==null">{{ element.due_date | dateTranslation }}</span>
<span *ngIf="element?.due_date==null">{{'NO DUE DATE'|translate}}</span>
</td>
</ng-container>
按升序排序时显示空值的选项有哪些?
我的解决方案是,进行自定义排序并挂接到 ngAfterViewInit:
ngAfterViewInit() {
this.dataSource.sortData = (data, sort: MatSort) => {
let sortedData = [];
sortedData = data.sort((a, b) => {
const direction = this.getSortingOrder(sort.direction, a, b);
if (!direction[0][sort.active] || !direction[1][sort.active]) {
return sort.direction === "asc" ? 0 : -1;
} else {
return direction[0][sort.active]
.toString()
.localeCompare(direction[1][sort.active]);
}
});
return sortedData;
};
}
getSortingOrder = (order, a, b) => {
const sorted = order === "asc" ? [a, b] : [b, a];
return sorted;
}
这将在按升序排序时将空值推到最后
我有一个类似的问题,即“当单击排序按钮时忽略空值,因此它们总是打印在 table 的末尾”。 我是这样解决问题的:
- 覆盖 MatTableDataSource 的 sortingDataAccessor 方法
- 检查项目属性值
- 如果值为空,则检查排序顺序
- 根据排序顺序:返回(可能的)最高/最低值,以便具有空值的行始终位于 table 的末尾(在您的情况下,您将反转返回值) .
这是一个代码示例:
this.rankingData = new MatTableDataSource();
this.rankingData.sortingDataAccessor = (item, property) => {
if(null == item[property]) {
if("desc" == this.sort.direction) return '\u0000'+'\u0000'+'\u0000';
return '\uFFFF'+'\uFFFF'+'\uFFFF';
}
return item[property];
};
简短的解决方案!如果value为null可以加一个unreal big number,所以肯定把这个item放在最下面
this.dataSource.sortingDataAccessor = (item, property) => {
return item[property] || 9999999999999;
};