开发者问题收集

DataTables js,如何使用带有“回调”函数的“ajax”选项?

2021-06-13
3886

我正在尝试使用 https://datatables.net/

目前,我们提前加载所有表数据并在客户端进行分页,这显然是一个坏主意,但是我找不到在服务器端如何进行分页的好例子。

显然,我应该使用 ajax 选项,但文档很差,请参阅 https://datatables.net/reference/option/ajax

它说语法如下:

$('#example').dataTable( {
  "ajax": function (data, callback, settings) {
    callback(
      JSON.parse( localStorage.getItem('dataTablesData') )
    );
  }
} );

Callback function that must be executed when the required data has been obtained. That data should be passed into the callback as the only parameter

但是这个 only的格式是什么参数 ??

我尝试传递一个数组(与我传递 data 选项的数组相同),但我得到:

datatables.bundle.min.js:1 Uncaught (in promise) TypeError: Cannot read property 'length' of undefined
        at datatables.bundle.min.js:1
        at E (datatables.bundle.min.js:1)
        at PatientsSearchTable.dataFetcher (PatientSearchUIController.js:163)
        at gA (datatables.bundle.min.js:1)
        at pA (datatables.bundle.min.js:1)
        at P (datatables.bundle.min.js:1)
        at HTMLTableElement.<anonymous> (datatables.bundle.min.js:1)
        at Function.each (jquery.min.js:2)
        at w.fn.init.each (jquery.min.js:2)
        at w.fn.init.o [as dataTable] (datatables.bundle.min.js:1)

例如 代码适用于以下配置

let config = {
            data: [[1,2],[3,4]],
            bDestroy: true,
            columns: [
                { title: 'A' },
                { title: 'B' },
                
            ],
        }

但以下内容给出了上述错误:

dataFetcher(data, callback, settings) {
    callback([[1,2],[3,4]])
}
generateTableData(dataSet) {

    let config = {
        ajax: this.dataFetcher.bind(this),
        bDestroy: true,
        columns: [
            { title: 'A' },
            { title: 'B' },
            
        ],
    }

编辑:我能够让以下内容工作

dataFetcher(data, callback, settings) {
    let jData =[[1,2],[3,4]]
    var dtData =  {"data": jData}
    callback(dtData)
}
generateTableData(dataSet) {

    let config = {
        ajax: this.dataFetcher.bind(this),
        bDestroy: true,
        columns: [
            { title: 'A' },
            { title: 'B' },
            
        ],
    }

感谢 如何使用 AJAX 选项填充 JQuery 数据表

注意:不需要 stringify ,如 var dtData =JSON.stringify( {"data": jData});

但我仍然需要这个 only 参数 的格式,例如,如何传递分页结果的数量以显示有多少页总计。

EDIT2:

我也能够使分页正常工作:

dataFetcher(data, callback, settings) {
        let jData = [[1, 2], [3, 4]]
        var dtData = {
            "data": jData,
            "draw": 1,
            "recordsTotal": 10,
            "recordsFiltered": 10,
        }
        callback(dtData)
    }
    generateTableData(dataSet) {

        let config = {
            ajax: this.dataFetcher.bind(this),
            bDestroy: true,
            columns: [
                { title: 'A' },
                { title: 'B' },

            ],
            pageLength: 2,
            serverSide: true
        }

请参阅 https://datatables.net/forums/discussion/59485/how-to-set-total-records-when-using-ajax-source-and-pipeline

注意:您可以在以下示例中看到返回的数据: https://datatables.net/examples/data_sources/server_side

使用 devTool 时如下: 在此处输入图片描述

2个回答

将主要观点集中在一个地方可能会对以后访问此问题的人有所帮助:

服务器端请求

当使用 serverSide: true 时,DataTables 会向您的服务器发送一个 Ajax 请求。

每当重新绘制表格时(以及首次初始化表格时),DataTables 都会自动生成此请求。导致重绘的主要操作包括:

  • 用户执行列排序
  • 用户执行搜索/过滤
  • 用户导航到不同的表格页面

可能还有其他触发器/事件也会导致重绘 - 但用户发起的排序、过滤和分页是主要触发器/事件。

该自动生成的 Ajax 请求的结构在 此页面 的“已发送参数”部分中描述。

这就是 DataTables 告诉您的服务器刚刚发生了哪些排序、过滤或分页操作的方式。

您的表格通常会有一个简单的 ajax 部分,因此 DataTables 知道将此请求发送到何处 - 例如例如:

ajax: {
  url: "https://yoururl.com/endpoint",
  type: "POST"
},

服务器端响应

您的服务器端框架负责处理此请求中的数据,并构建表示所请求结果页面的响应,并应用相关的过滤和排序。

这是服务器端处理“大容量”数据表的方式:它只需要发回一页结果 - 可能是 100 万条记录中的 100 条。

它还需要发送一些额外的数据,以便 DataTables 可以显示预期的“页面信息”,例如:

Showing 1 to 10 of 57 entries

服务器的 Ajax 响应的结构在 此页面 的“返回的数据”部分中描述。这包括服务器在构建其响应数据时计算出的 recordsTotalrecordsFiltered 值。

有任何端到端示例吗?

DataTables 文档包含几个示例 这里

但这些重点关注客户端(DataTable 本身)。

有一个完整(但基本的)端到端示例,使用 PHP 作为服务器端框架。请参阅 此页面 上的“服务器端脚本”选项卡。

此简短的 PHP 脚本依次使用以下内容:

require( 'ssp.class.php' );

您可以在 GitHub 上的 此处 找到该附加 PHP 文件。该文件显示了处理排序、过滤和分页的基本方法。

如果您使用的是不同的服务器端技术/框架,那么您的代码将拥有这些功能的自己的实现。


Ajax“回调”问题怎么样?

问题询问的是:

$('#example').dataTable( {
  "ajax": function (data, callback, settings) {
    callback(
      JSON.parse( localStorage.getItem('dataTablesData') )
    );
  }
} );

这是定义 DataTables Ajax 调用的几种变体之一 可以定义 。根据我的经验,这种特定变体很少使用/需要。

通常,您可能只需要这样的东西:

ajax: {
  url: "https://yoururl.com/endpoint",
  type: "POST"
},

但是使用回调方法,您可以实现 任何您希望 从 Ajax 调用返回数据的函数。在上面的“回调”示例中,该示例不是向某个外部服务(例如网站或 REST 端点)发出 HTTP 请求,而是从浏览器的 本地存储 中提取其“响应”数据。

此示例假设某些东西已经将这些数据放入本地存储中 - 并且假设数据已经具有服务器端响应的正确格式(实际上不是真正的服务器端响应)。

这基本上就是您无需进行 Ajax 调用即可“伪造”Ajax 请求的方法。

我不否认这里的文档措辞可以更清楚。

andrewJames
2021-06-13

问题是 此参数的格式是什么?

答案位于返回数据的文档中

https://datatables.net/manual/server-side

在此处输入图像描述

注意:我重新发布了@BhargavRao 删除的答案,不确定为什么,因为这是问题的答案,希望他不会再次删除它。

Elia Weiss
2021-06-14