服务端处理
有些情况下,读取 DOM 数据可能会过慢或过于繁重,特别是在处理数千或数百万数据行时。为了解决这个问题,DataTables 的服务端处理功能提供了一种方法,可让数据库引擎在服务端执行所有“繁重工作”(毕竟,它们经过高度优化,专门用于此类使用场景!),然后再将该信息绘制到用户的网络浏览器中。因此,您可以轻松显示包含数百万行的数据表。
在使用服务端处理时,DataTables 会向服务端发送一个 Ajax 请求,用于页面上的每条信息绘制(即翻页、排序、搜索等)。DataTables 会向服务端发送许多变量,以便其执行所需的处理,然后以 DataTables 所需的格式返回数据。
通过使用 serverSide
选项启用服务端处理,并通过使用 ajax
进行配置。有关配置选项的更多信息,请参见下文。
发送的参数
在通过服务端处理向服务端发出请求时,DataTables 为了让服务端了解所需的数据,会发送以下数据
参数名称 | 类型 | 说明 |
---|---|---|
draw |
整数 |
绘制计数器。DataTables 使用此项来确保服务端处理请求返回的 Ajax 按 DataTables 顺序绘制(Ajax 请求是异步的,因此可能会乱序返回)。这用作 draw 返回参数的一部分(见下文)。 |
start |
整数 |
分页第一条记录指示符。这是当前数据集中起始位置(从 0 开始的索引 - 即 0 是第一条记录)。 |
length |
整数 |
当前绘制中表格可显示的记录数。预期返回的记录数将等于此数字,除非服务端要返回的记录数较少。请注意,此项可以是 -1,表示应返回所有记录(尽管这会否定服务端处理的所有优点!) |
search[value] |
字符串 |
全局搜索值。应用于 searchable 为 true 的所有列。 |
search[regex] |
布尔值 |
如果在高级搜索中全局筛选器应视为正则表达式,则为 true ,否则为 false 。请注意,出于性能原因,在大型数据集中,服务端处理脚本通常不会对正则表达式进行搜索,但从技术角度而言这是可能的,由您的脚本自行决定。 |
order[i][column] |
整数 |
应应用排序的列。这是提交到服务端的 columns 信息数组的索引引用。 |
order[i][dir] |
字符串 |
此列的排序方向。它将分别为 asc 或 desc 以表示升序或降序。 |
columns[i][data] |
字符串 |
列的数据源,由 columns.data 定义。 |
columns[i][name] |
字符串 |
列的名称,由 columns.name 定义。 |
columns[i][searchable] |
布尔值 |
标志以指示此列是否可搜索(true )或否(false )。这由 columns.searchable 控制。 |
columns[i][orderable] |
布尔值 |
标志以指示此列是否可排序(true )或否(false )。这由 columns.orderable 控制。 |
columns[i][search][value] |
字符串 |
应用于此特定列的搜索值。 |
columns[i][search][regex] |
布尔值 |
标志以指示针对此列的搜索词是否应视为正则表达式(true )或否(false )。与全局搜索一样,出于性能原因,通常服务器端处理脚本不会对大型数据集合执行正则表达式搜索,但从技术上讲,这是可行的,并且由您的脚本来决定。 |
发送到服务器的 order[i]
和 columns[i]
参数是信息数组
order[i]
- 是一个数组,用于定义正在对多少列进行排序 - 即,如果数组长度为 1,则执行单列排序,否则执行多列排序。columns[i]
- 一个数组,用于定义表中的所有列。
在这两种情况下,i
均为一个整数,会发生更改以指示数组值。在大多数现代服务器端脚本环境中,这些数据会自动以数组的形式提供给您。
返回数据
一旦 DataTables 使用上述发送到服务器的参数请求数据,它便会期望将 JSON 数据返回给它,并设置以下参数
参数名称 | 类型 | 说明 |
---|---|---|
draw |
整数 |
作为数据请求的一部分发送的 draw 参数中的此次对象的绘制计数器。请注意,出于安全原因,强烈建议您将此参数转换为整数,而不是简单地向客户端回显其在 draw 参数中发送的内容,以防止跨站脚本 (XSS) 攻击。 |
recordsTotal |
整数 |
过滤前的数据记录总数(例如,数据库中的数据记录总数) |
recordsFiltered |
整数 |
过滤后的数据记录总数(例如,应用过滤后的数据记录总数 - 并非仅为此数据页面返回的数据记录数)。 |
data |
array |
要在表中显示的数据。这是一个数据源对象数组,每个行一个,DataTables 将使用此数组。请注意,可以使用 ajax 选项的 dataSrc 属性来更改此参数的名称。 |
error |
字符串 |
可选:如果在运行服务器端处理脚本期间出现错误,您可以通过使用此参数传递要显示的错误消息来通知用户此错误。如果没有错误,请不要包含。 |
除了控制整个表的上述参数外,DataTables 还可以对每个单独行的 data source 对象使用以下可选参数,以便为您执行自动操作
参数名称 | 类型 | 说明 |
---|---|---|
DT_RowId |
字符串 |
将 tr 节点的 ID 属性设置为该值 |
DT_RowClass |
字符串 |
将该类添加到 tr 节点 |
DT_RowData |
对象 |
使用 jQuery data() 方法将对象中包含的数据添加到行中以设置数据,该数据随后也可用于以后的检索(例如,针对单击事件)。 |
DT_RowAttr |
对象 |
将对象中包含的数据作为属性添加到 tr 节点行中。对象键用作属性键,值用作对应的属性值。此操作使用 jQuery param() 方法执行。请注意,此选项需要 1.10.5 版或更高版本 的 DataTables。 |
以下“示例数据”部分展示了使用这些选项返回示例的外观。
配置
通过使用 serverSide
选项启用 DataTables 中的服务器端处理。只需将其设置为 true
,DataTables 就会在服务器端处理模式下运行。您还需要使用 ajax
选项来指定 DataTables 应从中获取其 Ajax 数据的 URL。因此,最简单的服务器端处理初始化是
$('#example').DataTable( {
serverSide: true,
ajax: '/data-source'
} );
DataTables 如何发出 Ajax 请求的配置通过 ajax
选项进行配置。在上述示例中,我们将其用作字符串,指示 DataTables 使用其默认设置来发出 Ajax 请求。但是,您可以通过以下列方式传入 ajax
来自定义这些设置:
$('#example').DataTable( {
serverSide: true,
ajax: {
url: '/data-source',
type: 'POST'
}
} );
有关 DataTables 中可用的 Ajax 选项的更多信息,请参考 ajax
文档。
传统
旧版本的 DataTables (1.9-) 使用了一组不同的参数来向服务器发送和从服务器接收数据。因此,为 DataTables 1.10+ 编写的脚本将无法在 DataTables 1.9- 中运行。但是,DataTables 1.10 确实具有针对为 1.9- 编写的脚本的兼容模式。此兼容模式通过使用旧的 sAjaxSource
参数(而不是新的 ajax
参数)或通过设置 $.fn.dataTable.ext.legacy.ajax = true;
来触发。
有关执行服务器端处理的 1.9- 方法的文档,请参考 旧文档。
示例数据
服务器端处理返回的示例,使用数组作为表格的数据源(完整示例)
{
"draw": 1,
"recordsTotal": 57,
"recordsFiltered": 57,
"data": [
[
"Angelica",
"Ramos",
"System Architect",
"London",
"9th Oct 09",
"$2,875"
],
[
"Ashton",
"Cox",
"Technical Author",
"San Francisco",
"12th Jan 09",
"$4,800"
],
...
]
}
服务器端处理返回的示例,使用对象(还包括 DT_RowId
和 DT_RowData
)作为表格的数据源(完整示例)
{
"draw": 1,
"recordsTotal": 57,
"recordsFiltered": 57,
"data": [
{
"DT_RowId": "row_3",
"DT_RowData": {
"pkey": 3
},
"first_name": "Angelica",
"last_name": "Ramos",
"position": "System Architect",
"office": "London",
"start_date": "9th Oct 09",
"salary": "$2,875"
},
{
"DT_RowId": "row_17",
"DT_RowData": {
"pkey": 17
},
"first_name": "Ashton",
"last_name": "Cox",
"position": "Technical Author",
"office": "San Francisco",
"start_date": "12th Jan 09",
"salary": "$4,800"
},
...
]
}
可在本网站的 示例部分 中找到一组完整示例,探讨服务器端处理的可用选项。