What I want to do is to sort the data already grouped in alphabetical order or custom order. I used the sortField
attribute wich specify the groupheader order but I need to order the data inside the group too.
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
I have the same issues. I have added customized sort to solve this issues
To add a customized sort
<p-column field="color" header="color" sortable="custom" (sortFunction)="sortByColor($event)"></p-column>
In the typescript create a customSort
sortByColor(e) {
this.cars.sort(function (a, b) {
let aGroup = a.name.toLowerCase();
let bGroup = b.name.toLowerCase();
if (aGroup > bGroup) return 1;
if (aGroup < bGroup) return -1;
let aSort = a.color.toLowerCase();
let bSort = b.color.toLowerCase();
if (aSort > bSort) return 1;
if (aSort < bSort) return -1;
return 0
});
}
回答2:
For those who have the problem with TurboTable <p-table>
, here is the solution:
<p-table sortField="name" sortMode="single" (onSort)="onSort($event)" (sortFunction)="customSort($event)" [customSort]="true">
OnSort()
implementation:
onSort() {
// function to properly work with turbotable and rowgroup, see: https://www.primefaces.org/primeng/#/table/rowgroup
this.updateRowGroupMetaData();
}
customSort()
implementation:
customSort(e) {
this.budgets.sort((a, b) => {
const aGroup = a.name.toLowerCase();
const bGroup = b.name.toLowerCase();
if (aGroup > bGroup) { return 1; }
if (aGroup < bGroup) { return -1; }
const aSort = a.color;
const bSort = b.color;
if (aSort > bSort) { return 1; }
if (aSort < bSort) { return -1; }
return 0;
});
}
回答3:
I was facing the same issue.I have used custom sorting.Below is the code:
In Template:
<p-column field="color" header="color" sortable="custom" (sortFunction)="sortByColor($event,sortOrder)"></p-column>
Below is the sortByColor function in typescript:
sortOrder = 1;//1 means ascending order, 2 means descending order
sortByField(e, order) {
this.cars.Data.sort(function (a, b) {
let aGroup = a.name.toLowerCase();
let bGroup = b.name.toLowerCase();
if (aGroup > bGroup) return 1;
else if (aGroup < bGroup) return -1;
let aSort = a.color.toLowerCase();
let bSort = b.color.toLowerCase();
if (aGroup == bGroup) {
//ascending order
if (order == 1 && aSort < bSort) {
return -1;
}
//ascending order
else if (order == 1 && aSort > bSort) {
return 1;
}
//descending order
else if (order == 2 && aSort > bSort) {
return -1;
}
//descending order
else if (order == 2 && aSort < bSort) {
return 1;
}
}
return 1
});
this.sortOrder = this.sortOrder == 1 ? 2 : 1;
}
This is working for me.Hope this will work in your case also.