【发布时间】:2015-09-10 19:36:08
【问题描述】:
当对数据表使用Scroller 扩展时,您没有分页,而是一个滚动条中的所有行。我想知道,向下滚动表格后会触发什么事件,例如请参阅第 50-60 行,共 100 行。我还需要知道如何从数据表中取出这 10 行。我正在使用最新版本。非常感谢。
这是您从 Datatable.net 中的当前页面获取行的方式没有Scroller 扩展。
drawCallback: function (settings) {
var api = new $.fn.dataTable.Api(settings);
// Output the data for the visible rows to the browser's console
console.log(api.rows({ page: 'current' }).data().length);
}
更新 1:我的 Scroller 表初始化:
initScrollerTable = function ($table, url, inclFilter, dataTableOptionsSpecific) {
$.ajax({
method: "POST",
url: url,
data: dataParameterHelper.getCommonData(),
dataType: "json"
})
.done(function (rows) {
var dataTableOptions = $.extend(
{},
{ data: rows },
dataTableOptionsSpecific
);
initTable($table, inclFilter, dataTableOptions);
});
};
更新 2 更深入地阐述澄清问题的原始原因。
好吧,长话短说。我的表包含 26000 行,加载它需要 7 分钟。它包含大量数据库调用,JSON 大小为 21MB!我想优化它。
第一次尝试:我将我的 json 降到了绝对最小值,使其降至 1.5MB,但仍然几乎花费了7mins。在第二次测试中,它包含所有的 html,带有硬编码的数字/字符串,我做了 0 次 DB 调用。只花了3.5secs!。昨天我不知道我只需要专注于优化我对数据库的调用。
昨天,当我发布原始查询时,我的想法是填充表而不从数据库中提取任何数据,而是以一种延迟加载的方式加载它们。假设我展示了前 10 行。每列有 3 列,我需要为每个单元格调用数据库,总共是 30 倍。所以想法是对(10)个当前行发出 30 个请求,并将占位符替换为实际值。如果你能理解。我仍然会比 26.000 * 3 DB 调用更好:)
为此,我需要连接一个事件以获取 10 个当前行 ID,然后我可以循环发出 30 个 AJAX 请求。所以也许这是我需要的滚动事件,如果有这样的人的话。
但我不知道这是否是个好主意。通常,在您学习最佳实践之前/直到您学习最佳实践之前,“好”的想法只是“好” :)
我想我将开始专注于通过一些内部连接来减少数据库调用,你有什么,检索一个大的结果集,我可以在 15 秒内循环并填充我所有的 26.000(以及后来的 50.000)行!
【问题讨论】:
-
我认为您需要查看server-side processing 的那么多记录。据我了解,您想捕获滚动事件以从服务器加载数据,但 DataTables 使用
serverSide: true参数为您完成。但是在服务器端处理模式下,您需要自己在服务器上执行过滤、排序和分页。如果您的服务器端语言是 PHP,则 DataTables 分发中提供了一个示例ssp.class.php。 -
我已经使用服务器端几个月了。上个月,我刚刚用 Scroller(客户端 50.000)扩展替换了所有这些和我的客户端。我不喜欢服务器端的事情是自我执行过滤服务器端。它永远不会像客户端缓存表上的过滤那样好。
-
我不同意,正确索引的表在服务器端处理模式下表现出色,对我来说,它在处理 +3M 记录时表现良好。
-
听起来不错,但是您如何解决这样的场景,假设您有 3 列(姓名、电子邮件、年龄、国家/地区)。如果您在过滤器中写“us joe 30”。然后你有 3 个过滤词要搜索和 4 个表要查看(让我们假装姓名、电子邮件和年龄在他们的每个 db-table 中以保持简单)。总共有 12 db 搜索,这不是问题吗?如果您愿意,我们可以打开聊天或使用 Skype。 :)
标签: javascript events datatable callback datatables