11 typescript angular-material angular
我正在尝试使用 mat-sort 以角度对一个 mat-table 进行排序,问题是当我按升序/递减顺序排序时,算法顺序首先是大写单词,而不是非大写单词。如果我有一张具有以下名称的表:
“马克”“安东尼”
“马克”比安东尼先出现。
这是算法:
sortData(sort: Sort) {
const data = this.descricoesProdutos.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 'nome': return this.compare(a.nome, b.nome, isAsc);
case 'descricao': return this.compare(a.descricao, b.descricao, isAsc);
default: return 0;
}
});
}
compare(a: number | string, b: number | string, isAsc: boolean) {
return (a < b ? -1 : 1) * (isAsc ? 1 : -1);
}
Run Code Online (Sandbox Code Playgroud)
我的HTML:
<table matSort (matSortChange)="sortData($event)">
Run Code Online (Sandbox Code Playgroud)
小智 14
我看到针对此用例打开了一个 Github 问题:https ://github.com/angular/components/issues/9205
\nDennis Du Kr\xc3\xb8ger (LosD) 提供了一个非常优雅的答案,并由 Yakir Gottesman (YakirSmartag) 进行了改进:
\n在您的 ngOnInit() 中,添加此内容,它将适用于任何情况:
\nthis.dataSource.sortingDataAccessor = (data: any, sortHeaderId: string): string => {\n if (typeof data[sortHeaderId] === \'string\') {\n return data[sortHeaderId].toLocaleLowerCase();\n }\n\n return data[sortHeaderId];\n};\nRun Code Online (Sandbox Code Playgroud)\n
首先将名称设为大写(或小写),然后进行比较。那么这种差异就会消失。
return this.compare(a.nome.toUpperCase(), b.nome.toUpperCase(), isAsc);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7677 次 |
| 最近记录: |