即使存在,DataTables也不读取输入的值

时间:2019-11-11 11:49:58

标签: javascript jquery datatables

Data Tables 1.10.18(服务器端模式)和jquery 3.2.1

设置如下:

var bySubstancesTable = $('#bySubstancesTable').DataTable({
    processing: true,
    serverSide: true,
    searching: false,
    ajax: {
        data: {
           list_requested: 'bySubstancesTable',  // <table> #ID
           keywords: $('#keywords-bysubstancestable').val() // search keywords 
        },
        url: '/get-product-notifications.json', 
    },
    "language": {
        ...
        "processing": 'Loading notifications...'
    }

 ...

});

页面的标记中有一个<input>,其ID为#keywords-bysubstancestable,后跟表格的标记:

<input type="text" id="keywords-bysubstancestable">

<table id="bySubstancesTable" class="table display table-striped responsive" cellspacing="0" width="100%">
    <thead>
        <tr>
            <th>Date</th>
            <th>ID</th>
            <th>Substance Name</th>
            <th>Revision</th>
            <th>Affected Products</th>
        </tr>
    </thead>
</table>

在页面加载时,表已正确填充。我正在尝试实现一种自定义搜索功能,而不是使用与DataTables捆绑在一起的功能。我以前曾问过这个问题:DataTables - kill ajax requests when a new one has started是我基于其工作的。

当我尝试重绘表格时-在用户将输入输入到#keywords-bysubstancestable输入中之后-这样...

var debouncedDraw = _.debounce(function (opts) {
    bySubstancesTable.draw();
    return false;
}, 500);

...正在向/get-product-notifications.json发送ajax请求,但是即使我输入了输入,请求中的keywords:参数也为空。

奇怪的是,如果我console.log($('#keywords-bysubstancestable').val())实际上是在提供价值。例如,如果我在输入中键入“ Australia”,则console.log()语句将给出以下信息:

enter image description here

但是,即使在发送所有其他参数的情况下,在“网络”标签中,keywords:上的请求也为空:

enter image description here

为什么会这样?

结果是该表显示“正在加载通知...”文本,但该表中实际上没有任何更改。

我不明白这一点,因为我从另一个看起来确实有效的项目中复制了bySubstancesTable.draw();。我认为.draw()确实是重绘表格的正确方法吗?

1 个答案:

答案 0 :(得分:2)

您正在读取值并将其分配给keywords而不是expression本身,因此您的关键字始终是静态的,即初始化表时获得的值。

数据表支持function作为ajax.data的值,该值应采用数据对象并返回修改后的数据对象。

var bySubstancesTable = $('#bySubstancesTable').DataTable({
    processing: true,
    serverSide: true,
    searching: false,
    ajax: {
        data: function (d) {
          d.list_requested = 'bySubstancesTable';  // <table> #ID
          d.keywords = $('#keywords-bysubstancestable').val(); // search keywords
          return d;
        },
        url: '/get-product-notifications.json', 
    },
    "language": {
        ...
        "processing": 'Loading notifications...'
    }

 ...

});