微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ajax加载后更新数据表列搜索下拉框

如何解决ajax加载后更新数据表列搜索下拉框

我向我的数据表中添加一个带有单个列搜索 (https://datatables.net/examples/api/multi_filter_select.html) 的过滤功能,该功能运行良好。 这个表还有一个按钮来重新加载表数据。按钮触发代码如下:

table.ajax.url("foo").load();

它正确更新表数据。现在,我想用新的列数据更新搜索下拉框。我想清空下拉框,例如 select.empty() 然后填充该框,但不确定如何。我觉得这个更新过程应该写在“rowCallback”中。

解决方法

总结

要在每次 ajax 调用后重建下拉菜单,这是一种方法:

  1. 您可以在 DataTables 之外使用 jQuery ajax 调用获取数据,而不是使用 DataTables ajax 选项。

  2. 使用 jQuery done 函数填充表格,并在每次 ajax 调用后重新构建下拉列表。

此方法可确保在进行任何其他处理之前已获取 ajax 数据。

演练

假设我们有一个这样的按钮:

<button type="button" onclick="fetchData();">Reload Data</button>

还有一个像这样的 HTML 表格:

<table id="example" class="display" style="width:100%">
    <tfoot>
        <tr>
            <th></th>
            <th></th>
            <th></th>  <!-- you may need more footer cells in your table -->
        </tr>
    </tfoot>
</table>

这是相关的 fetchData 函数,它清除所有现有数据,然后用新获取的数据重新填充表:

function fetchData() {
  $.ajax({
    url: [your url goes here],// your URL here
    context: document.body
  }).done(function( data ) {
    var table = $('#example').DataTable();
    table.clear();
    table.rows.add(data);
    buildSelectLists();
    table.draw();
  });
}

重建选择列表的函数与 DataTables 示例解决方案中的逻辑相同:

function buildSelectLists() {
  
  $('#example').DataTable().columns().every(function() {
    var column = this;

    var select = $('<select><option value=""></option></select>')
      .appendTo($(column.footer()).empty())
      .on('change',function() {

        var val = $.fn.dataTable.util.escapeRegex(
          $(this).val()
        );
        column
          .search(val ? '^' + val + '$' : '',true,false)
          .draw();
      });

    column.data().unique().sort().each(function(d,j) {
      select.append('<option value="' + d + '">' + d + '</option>')
    });
  });
}

最后,DataTable 是在“文档就绪”函数中定义的:

$(document).ready(function() {

  $('#example').DataTable({
    // your options here - but no need for the ajax or data options
    "initComplete": function() {
      fetchData(); // make sure the table contains data,when it is created
    }
  });

});

或者:

您可以通过使用使用函数的 DataTables ajax 选项获得类似的结果:

示例(取自 documentation here):

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

我认为在这种情况下,将 ajax 调用保留在其自己的单独函数中会更简洁一些。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。