jQuery Datatable动态列场景如何正确配置serverSide服务端处理功能
问题原因分析
- 服务端模式下DataTable的
ajax.success回调为框架内部保留方法,自定义覆写后手动调用row.add()+draw()会重复触发表格重绘,重绘又会发起新的服务端请求,最终形成无限循环 - 服务端模式要求后端返回固定结构的响应参数,缺少
draw/recordsTotal/recordsFiltered等必填字段时,DataTable会判定数据加载失败,自动重复发起请求 - 动态列场景下未显式传入
columns列配置,DataTable无法自动匹配列数与返回数据的对应关系,导致数据无法正常渲染
修复方案
前端代码修改
无需修改原有HTML表格结构,只需调整JS逻辑:动态生成列配置、移除自定义success回调、通过dataSrc指定数据读取路径即可。
修改后完整JS代码如下:
$(document).ready(function () { // 动态生成列配置:遍历已渲染的表头生成对应列规则 const columns = [] $('#tag thead th').each(function() { columns.push({ defaultContent: '' }) // 配置空数据默认值,避免空值渲染报错 }) $("#tag").DataTable({ "aLengthMenu": [[5,10, 25, 50, 75, -1], [5,10, 25, 50, 75, "All"]], "iDisplayLength": 5, serverSide: true, stateSave: true, search: true, columns: columns, // 传入动态生成的列配置 ajax: { type: 'POST', dataType: 'json', url: 'GetFilteredPatientTagss', dataSrc: 'requestedRecords' // 指定表格数据从返回参数的requestedRecords字段读取 } }); });
后端接口规范
服务端需要接收DataTable自动传递的请求参数,处理后返回符合要求的响应结构:
接收的核心请求参数
draw:请求标识,响应时必须原封不动返回start:分页偏移量,即当前页第一条数据的下标length:每页展示条数search[value]:全局搜索关键词order[i][column]:排序列的索引order[i][dir]:排序方向(asc/desc)
必须返回的响应参数
draw:和请求传入的draw参数完全一致,不可自增或修改recordsTotal:未经过滤的总数据条数recordsFiltered:经过搜索、过滤后的总数据条数requestedRecords:当前页的数据集,数组内每个元素的字段顺序必须和表头列顺序完全对应
注意事项
- 服务端模式下不要自定义
ajax.success回调,所有数据渲染逻辑由DataTable内部自动处理 - 如果后端返回的是对象格式的数据集,动态生成
columns时可以指定data属性为对应的字段名,无需按顺序匹配 - 排序、搜索逻辑需要后端自行根据请求参数实现,DataTable服务端模式不会自动处理数据过滤
内容的提问来源于stack exchange,提问作者Biraj Dahal
相关产品推荐
相关产品推荐

