应用程序正在使用:
数据表 1.10.18
jQuery 3.2.1
PHP 后端
lodash 4.17.4
该应用程序包含一个由多个数据表组成的网页。这些中的每一个都使用serverSide: true
(服务器端模式)通过返回 JSON 数据的 ajax 端点获取数据。
表初始化如下:
在页面加载<table>时,会呈现几个 '。我正在使用 jquery.each()为每个初始化 DataTable:
$.each($('table'), function () {
$(this).DataTable({
processing: true,
serverSide: true,
searching: false,
ajax: {
data: {
table_id: $(this).attr('id')
},
url: '/get-data.json',
},
...
});
每个<table>人都有一个 ID。这是通过data:属性中的 ajax 传递的。端点/get-data.json根据表 ID 返回数据。换句话说,它知道应该根据这个 ID 为“哪个表”获取数据。
我希望能够在表格上进行搜索,但必须在服务器端完成。出于这个原因,我在 (1) 中设置了初始化代码,searching: false因为这有效地禁用了 DataTables 提供的客户端搜索工具(我们不能在这种情况下使用它,因为搜索必须在服务器端完成)。
我面临的问题是如何为每个表创建搜索输入、进行 ajax 调用并更新相应的表。我希望在输入 >=3 个字符后实时搜索。这个问题的关键是 1 个搜索输入负责搜索 1 个数据表 - 它不是一个搜索功能,输入可以更新“页面上的任何/每个表”,这是其他问题中常见的模式。1 个输入:在这种情况下搜索 1 个表。
我的计划如下 - 第 (2) 点中引用的每个表都有一个 ID。我需要创建独特的输入。因此,如果我有 ID 为 , 的表,#table1我可以轻松创建:#table2#table3
<input type="text" name="table1_search" id="table1_search">
<input type="text" name="table2_search" id="table2_search">
<input type="text" name="table3_search" id="table3_search">
上面的代码在等待输入 >=3 个字符方面完成了我需要的操作。然后我正在执行一个名为的函数,该函数debouncedDraw传递一个包含search_idand的对象search_value。这些分别指的是输入 ID 和值,例如,如果我在其中键入“foo”,#table1_search那么对象是:
{search_id: 'table1_search', search_value: 'foo'}
debouncedDraw函数看起来像这样。这是使用lodash来限制函数可以触发的速率。这里的重点是根据我几年前在这里提出的一个问题来阻止它发出不必要的 ajax 请求:DataTables - 当一个新请求开始时终止 ajax 请求:
var debouncedDraw = _.debounce(function (opts) {
console.log(opts);
}, 500);
目前,这只是console.log上面给出的对象。
我不确定在这一点上进行的最佳方式。我需要通过 ajax 重新运行/get-data.json,然后更新相应的表。
我可以访问请求数据并根据下划线拆分数据search_id以计算出数据用于哪个表 ID(例如table1_searchtargets #table1)。然后我需要将这些数据写回适当的表(#table1在这种情况下)。
我忍不住想我会以一种复杂的方式来解决这个问题,并想知道 DataTables 本身是否有更好的方法来支持这一点?这似乎是一个非常基本的要求(serverSide模式下的多个可搜索表)。但我找不到任何具体提到如何做到这一点的帖子。
慕神8447489
繁星淼淼