我将mat table用于排序,我想在其中对特定列设置默认排序。
这适用于普通属性,但不适用于嵌套属性。
这是我的桌子
<table mat-table [dataSource]="dataSource" multiTemplateDataRows
matSort matSortActive="break" matSortDirection="asc"
class="mat-elevation-z4 w-100">
我的嵌套排序
this.dataSource.sort = this.sort;
this.dataSource.sortingDataAccessor = (item, property) => {
switch(property) {
case 'break': return item.break.start;
default: return item[property];
}
};
这种嵌套排序也很好,当您手动单击标题以进行排序时,它会执行我期望的操作,但是默认情况下它不会进行排序,只显示排序箭头。
这就是页面加载时的样子:
这里是相应的stackblitz。
答案 0 :(得分:1)
5月份进行研究时,初始排序无法正常工作。
对于我来说,有必要编写自己的setSortHeader
函数,该函数在获取数据后执行。
setSortHeader() {
this.sort.active = 'break';
this.sort.direction = 'desc';
this.sort.sortChange.emit({ active: this.sort.active, direction: this.sort.direction });
const sortHeader = this.sort.sortables.get('break');
if (sortHeader) sortHeader['_setAnimationTransitionState']({ toState: 'active' });
}
我不确定该代码是否仍然必要,但就我而言仍然有效。
答案 1 :(得分:1)
<ng-container matColumnDef="firstName">
<th mat-header-cell class="mat-header-sticky" id="firstName" *matHeaderCellDef mat-sort-header tabindex="0"
[attr.aria-label]="'First Name Tool Tip'" [matTooltip]="tooltipConfiguration['firstName']"
[matTooltipPosition]="'above'" [matTooltipClass]="'matTooltip-panel'">
First Name
</th>
<td mat-cell *matCellDef="let contact" class="align-center">
<span class="display-block overflow-ellipsis">
{{ contact.firstName }}
</span>
</td>
</ng-container>
只需使用相同的 matColumnDef="firstName"
和 {{ contact.firstName }}
,注意属性 .firstName
与 matColumnDef
ID 匹配。这是根据角度文档。
答案 2 :(得分:0)
请尝试以下操作。
如果要更改默认方向,请在ngOnInit方法调用上将其更改为this.sortItem
// app.component.ts
import { Component, ViewChild } from '@angular/core';
import { Sort, MatSort, MatPaginator } from '@angular/material';
import { interval } from 'rxjs';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
public displayedColumns: string[] = ['name', 'break',];
public sortedData: any;
constructor( ) { }
ngOnInit() {
setTimeout(() => {
this.sortItem({ active: 'break', direction: 'asc' });
}, 1000);
}
compare(a: number | string, b: number | string, isAsc: boolean) {
return (a < b ? -1 : 1) * (isAsc ? 1 : -1);
}
sortItem(sort: Sort) {
const data = DATA_SOURCE.slice();
if (!sort.active || sort.direction === '') {
this.sortedData = data;
return;
}
this.sortedData = data.sort((a, b) => {
const isAsc = sort.direction === 'asc';
switch (sort.active) {
case 'break': return this.compare(a.breakTime.start, b.breakTime.start, isAsc);
default: return 0;
}
});
}
}
const DATA_SOURCE = [
{
name: 'Alice',
breakTime: {
start: '14-00',
end: '14-00'
},
},
{
name: 'Steve',
breakTime: {
start: '10-00',
end: '11-00'
},
},
{
name: 'Bob',
breakTime: {
start: '12-00',
end: '13-00'
},
},
];
// app.component.html
<table mat-table [dataSource]="sortedData" multiTemplateDataRows
matSort (matSortChange)="sortItem($event)"
class="mat-elevation-z4 w-100">
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef> Name </th>
<td mat-cell *matCellDef="let item"> {{item.name}} </td>
</ng-container>
<ng-container matColumnDef="break">
<th mat-header-cell *matHeaderCellDef mat-sort-header > Break </th>
<td mat-cell *matCellDef="let element">
{{element.breakTime.start}} - {{element.breakTime.end}}
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let element; columns: displayedColumns;"
class="element-row"
[class.example-expanded-row]="expandedElement === element"
(click)="expandedElement = expandedElement === element ? null : element">
</tr>
</table>