gpt4 book ai didi

angular - 如何使用ngx-datatable实现服务器端分页+服务器端排序

转载 作者:太空狗 更新时间:2023-10-29 17:43:17 28 4
gpt4 key购买 nike

使用 Angular 组件 ngx-datatable来自 Swilane可以使用 server-side pagingserver-side sorting .

它们都有文档,但是不清楚如何将它们结合起来并同时使用服务器端分页+排序

根据文档,分页会在用户更改页面时自动调用回调:

setPage(pageInfo) {
this.page.pageNumber = pageInfo.offset;
this.serverResultsService.getResults(this.page).subscribe(pagedData => {
this.page = pagedData.page;
this.rows = pagedData.data;
});

排序也是如此:

onSort(event) {
// event was triggered, start sort sequence
console.log('Sort Event', event);
this.loading = true;
// emulate a server request with a timeout
setTimeout(() => {
const rows = [...this.rows];
// this is only for demo purposes, normally
// your server would return the result for
// you and you would just set the rows prop
const sort = event.sorts[0];
rows.sort((a, b) => {
return a[sort.prop].localeCompare(b[sort.prop]) * (sort.dir === 'desc' ? -1 : 1);
});

this.rows = rows;
this.loading = false;
}, 1000);
}

但是如何组合它们呢?

最佳答案

我发现处理服务器端分页和服务器端排序的最佳方法包括:

  • 有一个 page 对象,它包含所有的分页和排序信息(如顺序列、顺序方向、页码、页面大小……),这些信息将绑定(bind)到表格

  • 有一个函数 reloadTable() 调用 API 以使用存储在 page 对象中的数据作为参数获取数据,自动重新渲染 table

  • 有一个pageCallback,它更新page中包含的数据,与分页相关,并且然后调用 reloadTable()

  • 有一个sortCallback更新page中包含的与排序相关的数据,并且然后调用 reloadTable()

例子:

import { Component, OnInit } from '@angular/core';
import { HttpClient, HttpParams } from '@angular/common/http';

@Component({
selector: 'app-my-component',
template: `
<ngx-datatable
class="bootstrap table table-striped"
[rows]="rows"
[columns]="columns"
[columnMode]="'force'"
[headerHeight]="50"
[footerHeight]="50"
[rowHeight]="'auto'"
[externalPaging]="true"
[externalSorting]="true"
[count]="page.count"
[offset]="page.offset"
[limit]="page.limit"
[sortType]="'single'"
(page)="pageCallback($event)"
(sort)="sortCallback($event)"
></ngx-datatable>
`
})
export class MyComponent implements OnInit {
page = {
limit: 10,
count: 0,
offset: 0,
orderBy: 'myColumn1',
orderDir: 'desc'
};

rows: Object[];

columns = [
{ name: 'myColumn1' },
{ name: 'myColumn2' },
{ name: 'myColumn3' },
];

constructor(private httpClient: HttpClient) { }

ngOnInit() {
this.pageCallback({ offset: 0 });
}

/**
* Called whenever the user changes page
*
* check: https://swimlane.gitbooks.io/ngx-datatable/content/api/table/outputs.html
*/
pageCallback(pageInfo: { count?: number, pageSize?: number, limit?: number, offset?: number }) {
this.page.offset = pageInfo.offset;
this.reloadTable();
}

/**
* Called whenever the user changes the sort order
*
* check: https://swimlane.gitbooks.io/ngx-datatable/content/api/table/outputs.html
*/
sortCallback(sortInfo: { sorts: { dir: string, prop: string }[], column: {}, prevValue: string, newValue: string }) {
// there will always be one "sort" object if "sortType" is set to "single"
this.page.orderDir = sortInfo.sorts[0].dir;
this.page.orderBy = sortInfo.sorts[0].prop;
this.reloadTable();
}

/**
* You will render the table once at the beginning in ngOnInit()
* and then every time the page OR the sort order are changed
*/
reloadTable() {

// NOTE: those params key values depends on your API!
const params = new HttpParams()
.set('orderColumn', `${this.page.orderBy}`)
.set('orderDir', `${this.page.orderDir}`)
.set('pageNumber', `${this.page.offset}`)
.set('pageSize', `${this.page.limit}`);

this.httpClient.get(`http://www.your-api.com/path/resource`, { params })
.subscribe((data) => {

// NOTE: the format of the returned data depends on your API!
this.page.count = data.count;
this.rows = data.rows;
});
}
}

关于angular - 如何使用ngx-datatable实现服务器端分页+服务器端排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46040077/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com