如何从数据表滚动扩展中获取显示行?
How do I get the showing rows from datatable Scroller extention?
当对数据table使用 Scroller 扩展时,您没有分页,但所有行都在一个滚动条中。我想知道,向下滚动 table 后会触发什么事件,例如请参阅第 50-60 行,共 100 行。我还需要知道如何从数据 table 中取出这 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);
}
Update 1: My Init of Scroller table:
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);
});
};
Update 2 Deeper elaborating on the origional reason for the question to clarify.
好吧,长话短说。我的 table 包含 26000 行,加载它需要 7 分钟。它包含大量的数据库调用,JSON 的大小为 21MB!我想优化它。
第一次尝试:我将我的 json 设置为绝对最小值,将其降至 1.5MB,但它仍然花费了将近 7mins
。在第二次测试中,它包含所有 html,硬编码 numbers/strings,我进行了 0 次数据库调用。只用了3.5secs!
。昨天我不知道我只需要专注于优化对数据库的调用。
昨天,当我发布原始查询时,我的想法是填充 table 而不从数据库中提取任何数据,而是以一种延迟加载的方式加载它们。假设我展示了前 10 行。每个单元格有 3 列,我需要为每个单元格调用数据库,总共 30 次。所以想法是对 (10) 当前行发出 30 个请求,并用实际值替换占位符。如果你能理解。我仍然会比 26.000 * 3 个数据库调用更好:)
为此,我需要连接一个事件以获取 10 个当前行 ID,然后我可以循环发出 30 AJAX 请求。所以也许这是我需要的滚动事件,如果有这样的人的话。
但我不知道这是不是个好主意。通常一个 "good" idea 只是 "good" before/until 你学到最好的实践:)
我想我将开始专注于通过一些内部连接减少数据库调用,你有什么,检索一个大的结果集,我可以在 15 秒内循环遍历并填充我所有的 26.000(以及后来的 50.000)行!
SOLUTION
使用 xhr
event to handle Ajax requests and page.info()
检索有关 table 的信息,如下所示。
请注意,在初始化 table 以处理初始 Ajax 请求之前,需要附加事件处理程序。
$('#example').on('xhr.dt', function ( e, settings, json, xhr ) {
var api = new $.fn.dataTable.Api(settings);
var info = api.page.info();
console.log('Data has been loaded', info);
});
DEMO
有关代码和演示,请参阅 this jsFiddle。
当对数据table使用 Scroller 扩展时,您没有分页,但所有行都在一个滚动条中。我想知道,向下滚动 table 后会触发什么事件,例如请参阅第 50-60 行,共 100 行。我还需要知道如何从数据 table 中取出这 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);
}
Update 1: My Init of Scroller table:
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);
});
};
Update 2 Deeper elaborating on the origional reason for the question to clarify.
好吧,长话短说。我的 table 包含 26000 行,加载它需要 7 分钟。它包含大量的数据库调用,JSON 的大小为 21MB!我想优化它。
第一次尝试:我将我的 json 设置为绝对最小值,将其降至 1.5MB,但它仍然花费了将近 7mins
。在第二次测试中,它包含所有 html,硬编码 numbers/strings,我进行了 0 次数据库调用。只用了3.5secs!
。昨天我不知道我只需要专注于优化对数据库的调用。
昨天,当我发布原始查询时,我的想法是填充 table 而不从数据库中提取任何数据,而是以一种延迟加载的方式加载它们。假设我展示了前 10 行。每个单元格有 3 列,我需要为每个单元格调用数据库,总共 30 次。所以想法是对 (10) 当前行发出 30 个请求,并用实际值替换占位符。如果你能理解。我仍然会比 26.000 * 3 个数据库调用更好:)
为此,我需要连接一个事件以获取 10 个当前行 ID,然后我可以循环发出 30 AJAX 请求。所以也许这是我需要的滚动事件,如果有这样的人的话。
但我不知道这是不是个好主意。通常一个 "good" idea 只是 "good" before/until 你学到最好的实践:)
我想我将开始专注于通过一些内部连接减少数据库调用,你有什么,检索一个大的结果集,我可以在 15 秒内循环遍历并填充我所有的 26.000(以及后来的 50.000)行!
SOLUTION
使用 xhr
event to handle Ajax requests and page.info()
检索有关 table 的信息,如下所示。
请注意,在初始化 table 以处理初始 Ajax 请求之前,需要附加事件处理程序。
$('#example').on('xhr.dt', function ( e, settings, json, xhr ) {
var api = new $.fn.dataTable.Api(settings);
var info = api.page.info();
console.log('Data has been loaded', info);
});
DEMO
有关代码和演示,请参阅 this jsFiddle。