【问题标题】:How to populate a jQuery DataTable with an XHR response如何使用 XHR 响应填充 jQuery DataTable
【发布时间】:2018-10-17 02:52:18
【问题描述】:

我已经看到很多关于此的问题,但没有一个答案让我足够接近以解决我的问题。希望对于外面的人来说这是一个简单的。 我正在尝试使用 XHR 响应来填充 DataTable。通过单击按钮执行对 Java servlet 的请求。请求如下所示:

function callFileSearchServlet(){
  var xhr = new XMLHttpRequest();
  xhr.open("GET", "http://localhost:8080/FileSearch-1/FileSearch?selectedDataSource=foo&startDate=20180101&endDate=20180102", true );
  xhr.setRequestHeader("Content-type", "application/json");
  xhr.send(null);
  xhr.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        theResponse = this.responseText;
        editedJsonText = theResponse.substring(8, theResponse.length-1);
        displaySearchResults();
    }
}    

为了这篇文章,我对 servlet 期望接收的 URL 参数进行了硬编码。 servlet 查看文件系统并将有关文件的元数据写入 JSON。从技术上讲,响应的开头包含以下文本

{"data":

但我不确定它应该在什么条件下实际存在,因此在修剪后,响应如下所示:

[{"date":"20180101","status":"Incomplete","total_files":66,"total_size":38014958},{"date":"20180102","status":"Complete","total_files":72,"total_size":55471119}]

问题是我不能只将响应分配给一个变量并使用它来填充我的 DataTable。当我在我的 JavaScript 文件中使用静态数据时,这种方法很有效。我将静态数据分配给全局 JavaScript 变量 (myData),并将该变量用作 DataTable 中的数据源。像这样: $(document).ready(function () { var table = $('#search_results').DataTable({ "data": myData, "columns": [ { "className": "details-control", "orderable": "false", "data": "null", "defaultContent": '', "render": function () { return '<i class="fa fa-plus-square" aria-hidden="true"></i>'; }, "width":"15px" }, { "render": function () { return '<input type="checkbox" id="chkbx1" name="flightDirPaths" value="theValue1">'; } }, { "data": "date" }, { "data": "status" }, { "data": "total_files" }, { "data": "total_size" } ], "order": [[1, 'asc']] });

如果我将 myData 替换为实际数据(如上所示),表格将正确显示。所以我知道格式很好。 所以现在我有了 XHR 响应,但我不知道如何让我的 DataTable 使用它。我查看了大多数文档和很多论坛,但还没有看到如何做到这一点。可以做到吗?我觉得我必须使用 AJAX 请求,尽管我已经阅读了所有文档,但我仍然不太明白。更具体地说,https://datatables.net/reference/option/ajax 此处的文档说明如下:

ajax 属性具有三种不同的操作模式,具体取决于它的定义方式。这些都是: 字符串 - 设置应从中加载数据的 URL。 object - 定义 jQuery.ajax 的属性。 function - 自定义数据获取函数

将数据写入某个文件时是否应该使用“URL 模式”?与直接从 servlet 传递数据相比,将数据写入文件以供 DataTable 摄取似乎是一个额外的步骤。也许我对此很短视,因为我对此没有太多经验。我注意到 Stackoverflow 上绝大多数基于 AJAX 的解决方案都包括 URL 模式,但我的 servlet 没有将数据写入文件,我也不希望它这样做。我猜“功能模式”是我需要使用的。谁能证实这一点?如果这不是最好的解决方案,有人知道我应该怎么做吗?文档说明函数模式需要三个参数(数据、回调和设置),如下所示:

$('#example').dataTable({"ajax": function (data, callback,settings){callback(JSON.parse( localStorage.getItem('dataTablesData')));}}); 

我从概念上理解参数,但实际上创建每个参数的方式并不多。例如,我是否将所有 servlet 参数(selectedDataSource、startDate、endDate)分配给一个名为“data”的变量?如果是这样,它在语法上和我的 JavaScript 文件中的确切位置实际上看起来像什么?这个过程的细节让我无法理解。也许有一些我没有的假设知识。任何帮助表示赞赏。

【问题讨论】:

  • 您在 onreadystatechange 函数中的任何行是否填充了数据表?
  • @manjack 用myData 分配dataTable 属性数据不起作用?我们可能需要在数据表初始化后添加数据/行。
  • @manjack 我在您的数据表初始化中注意到 myData 是一个字符串; "data": "myData" 描述拼写错误或您的代码中是否存在拼写错误?
  • @Flemmin 简短的回答是否定的。我尝试了 2 种不同的解决方案。我用 onreadystatechange 中定义的“editedJsonText”替换了“myData”。它为第一个数组元素“日期”列返回“请求的未知参数”错误。请参阅此处:datatables.net/manual/tech-notes/4 我还尝试将 DataTable 代码移动到 onreadystatechange 函数中。在上面的代码中,您将看到一个名为 displaySearchResults 的函数,它包含构建表的所有代码。我只是把它全部移到了 onreadystatechange 中。它返回了同样的错误。这能回答你的问题吗?
  • 是的,确实如此。谢谢。

标签: javascript jquery ajax datatables


【解决方案1】:

我想出了一个解决方案。我不必使用功能模式。我只是在 DataTable 初始化中使用了 AJAX 调用,而不是在表初始化之外使用了 XHR 请求。 AJAX 调用中的 URL 值是我的 servlet 的 URL。所以我删除了 XHR 请求,在表初始化中创建了一个 AJAX 请求,并将其全部移动到按钮单击函数中,因此当用户单击按钮时,表会显示从 servlet 返回的数据。我在上面发布了新代码。这个网站有帮助。 https://datatables.net/forums/discussion/45615/how-to-load-table-from-ajax-request

这是我可以正常工作的新代码。我的旧代码和下面的代码之间的区别在于以“var table =...”和“”columns“:...”开头的行之间

$(document).ready(function () {
    var table = $('#search_results').DataTable({
        "ajax": {
            url: "http://localhost:8080/FileSearch-1/FileSearch?selectedSources=foo&startDate=20180101&endDate=20180102",
            method: "GET",
            xhrFields: {
                withCredentials: true
            }
        },
        "columns": [
            {
            "className": "details-control",
            "orderable": "false",
            "data": "null",
            "defaultContent": '',
            "render": function () {
                return '<i class="fa fa-plus-square" aria-hidden="true"></i>';
            },
            "width":"15px"
            },
            { "render": function () {
                return '<input type="checkbox" id="chkbx1" name="flightDirPaths" value="theValue1">';
                }
            }, 
            { "data": "date" },
            { "data": "status" },
            { "data": "total_files" },
            { "data": "total_size" }
        ],
        "order": [[1, 'asc']]
    });

【讨论】:

    猜你喜欢
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2012-08-13
    相关资源
    最近更新 更多