【问题标题】:How do I get the showing rows from datatable Scroller extention?如何从数据表滚动扩展中获取显示行?
【发布时间】: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


【解决方案1】:

解决方案

使用xhr 事件处理Ajax 请求,使用page.info() 检索有关表的信息,如下所示。

请注意,在初始化表以处理初始 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);
});

演示

有关代码和演示,请参阅this jsFiddle

【讨论】:

  • 事件xhr.dt 没有为我触发。请参阅我的更新 1。可能是因为我先检索了所有行。我这样做是为了对缓存表进行非常快速的过滤,但我不知道它有多聪明,因为现在获得 20.000 行对我来说需要 4 分钟 :( 我可以看到你通过 ajax 回调获得了 10 行。
  • 我可以在你的小提琴中看到,该信息包含我正在寻找的内容,并且它正在使用你认为我的 Api,所以我会接受,因为它是解决方案。 xhr.dt 事件并没有为我触发,我仍然不知道为什么,但也许我稍后会弄清楚。 (我在初始化之前已经附上了)。
  • @radbyx,感谢您找到丢失的分号 :)。您没有收到 xhr.dt 事件,因为您最初检索所有数据并将其直接提供给 DataTables。你能否在你的问题中澄清你想再次捕捉什么事件?将事件处理程序附加到scroll 事件并检索page.info() 会解决您的问题吗?
  • 添加了更多上下文,很抱歉第一次没有说清楚:)
  • 事实是,我们喜欢过滤功能。它会立即找到缓存表中的所有内容,然后我们在其上构建我们的功能。据我了解,要使其工作,除了在您可以看到的表中的每个字符串上为数据表提供所有数据以供过滤器工作外,别无他法。在我们拥有的早期版本中,我们的过滤器向我们的服务器发出请求,进行数据库调用并返回“10”行。它可能很快,但最大的缺点是,您无法在所有数据库表中轻松搜索以找到正确的行(也可以组合行值使其不可能)
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多