[英]Sort a list component in Angular
我正在嘗試對用角形材質創建的列表組件進行排序。
<div style="width:30%;">
<mat-nav-list matSort (matSortChange)="sortData($event)">
<th mat-sort-header="stuff.name">Name</th>
<mat-list-item *ngFor="let stuff of vehicleDetails">
<button matLine (click)="updateInfo(stuff.id)"> {{ stuff.name }} </button>
<button mat-icon-button id="btn" *ngIf='check(stuff.alarm)' matTooltip="{{stuff.alarm[tooltipIndex(stuff)]?.timestamp}} - {{stuff.alarm[tooltipIndex(stuff)]?.description}}">
<mat-icon>info</mat-icon>
</button>
</mat-list-item>
</mat-nav-list>
</div>
列表中顯示的數據是一堆車輛名稱。 它來自我的vehicleDetails,它是VehicleDetail類型的數組,包含諸如名稱,id等屬性。現在,我正在嘗試按名稱排序。 我在嘗試實現此功能時使用以下功能:
export class VehiclelistComponent implements OnInit, AfterViewChecked
{
vehicleDetails: VehicleDetail[] = [];
sortedVehicleDetails: VehicleDetail[];
sortData(sort: Sort) {
const data = this.vehicleDetails.slice();
if (!sort.active || sort.direction === '') {
this.sortedVehicleDetails = data;
return;
}
this.sortedVehicleDetails = data.sort((a, b) => {
const isAsc = sort.direction === 'asc';
switch (sort.active) {
case 'name':
return this.compare(a.name, b.name, isAsc);
default:
return 0;
}
});
}
compare(a, b, isAsc) {
return (a < b ? -1 : 1) * (isAsc ? 1 : -1);
}
我的ngOnInit和ngAfterViewChecked看起來像這樣
ngOnInit() {
// Init vehicles
this.getVehicleDetails();
}
ngAfterViewChecked() {
this.sortedVehicleDetails = this.vehicleDetails.slice();
}
如何解決我的問題,以便可以按名稱或其他任何屬性排序?
您還需要獲取需要對對象數組進行排序的屬性。
像這樣
sort(value: any[], criteria: SortCriteria): any[] {
if (!value || !criteria)
return value;
let p: string = criteria.property;
let sortFn:(a: any, b: any) => any = (a, b) => {
let value: number = 0;
if (a[p] === undefined) value = -1;
else if (b[p] === undefined) value = 1;
else value = a[p] > b[p] ? 1 : (b[p] > a[p] ? -1 : 0);
return criteria.descending ? (value * -1) : value;
};
value.sort(sortFn);
return value;
}
哪里是SortCriteria
,
interface SortCriteria {
property: string;
descending?: boolean;
}
您還可以創建管道,以便可以直接在模板中使用它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.