【问题标题】:Datatables handle array data in the footer filtering数据表在页脚过滤中处理数组数据
【发布时间】:2020-03-04 10:02:05
【问题描述】:

我有一个带有页脚过滤的数据表。 每列有 1 个值,与处理页脚过滤的默认方式完美搭配:

//Add footer filtering
this.api().columns([2, 6, 7, 8, 9, 10]).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) {
        console.log(d);
        if (d) {
            var val = $('<div/>').html(d).text();
            select.append('<option value="' + val + '">' + val + '</option>')
        }
    });
});

现在例外(第 6 栏);有一列填充了 3 种可能性:

1)

2) 一个值的数组

3) 具有多个值的数组

Atm 在下拉列表中选择一个选项时,过滤不会找到我认为的任何结果,因为它搜索文本并且那里的数据作为数组发送(见下文)。 de datatable本身的html插入如下:

<span class="badge badge-pill badge-primary">suborg test met lange titel</span>

我进行了广泛的搜索,但似乎找不到适合我的解决方案的正确方法。 结果应该是页脚过滤器下拉列表将为每个单独的标签包含一行,并且它实际上是过滤器。 所以理想的结果是:

(请注意,这是直接在 HTMl 中作为 ex 编辑的)

在上面的代码 sn-p 中有一个控制台日志,它显示了该列的数据是如何传递的:

我想为该列创建一个特定的页脚过滤,但我真的被困在如何处理数组数据上:

this.api().columns(6).every( function () {}

谁能提供我缺少的黄金提示?

提前致谢


编辑

我已经能够遍历数据并在下拉列表中获得更好的选项:

这通过使用以下代码:

column.data().unique().sort().each(function (d, j) {
    if (d) {
        $.each(d, function (index, value) {

            var val = $('<div/>').html(value).text();
            select.append('<option value="' + val + '">' + val + '</option>');
        });

    }
});

但是过滤与数据表中的任何结果都不匹配.. 仍然非常坚持这一点。

【问题讨论】:

  • 如果它是一个数组,你可以循环遍历它,然后创建一个搜索字符串或任何你想要的。
  • @AhmedSunny 感谢我错过的洞察力。我现在使用这种方法来更好地填充下拉列表(编辑 Q),但我仍然无法匹配数据表中的任何数据
  • 试试这个,将 type: 'html' 添加到 tags 列的 columndef 中。看看它是否有效

标签: jquery datatables


【解决方案1】:

您能否删除这些搜索额外值并检查

column.search(val ? '^' + val + '$' : '', true, false).draw();

column.search(val).draw();

you can also search each column through--

//indexcolumn--where we need the filter (column index )



  initComplete: function()
     {
    this.api().columns(indexcolumn).every(function() 
    {
        var column = this;
        $('input', this.header()).on('keyup', function() {
          if (column.search() !== this.value) {
            column
              .search(this.value)
              .draw();
          }
        });
      });

    }

更多信息—— https://jsfiddle.net/vigneshwarannevilish/gx5vh9jm/73/

【讨论】:

  • 您是否知道在当前设置中也可以删除下拉列表中的重复值?
  • 好吧,不用担心,我通过与值的额外数组索引进行交叉检查来弄清楚
【解决方案2】:

这是一个独立的解决方案,使用稍微不同的方法。

您可以将以下文本加载到文件中并在浏览器中打开它。它包含两个过滤器:

  • 第 1 列上的文本输入过滤器
  • 第 2 列的下拉(选择)过滤器

过滤器相互结合使用(如果您有多个不同类型的列过滤器,我假设您会想要)。下拉列表是有序和重复数据删除的,并且基于表格列中的标签,当表格首次呈现时。

有一个全局搜索字段,但如果您不需要它可以将其关闭。

示例截图:

HTML 页面:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Animals</title>
  <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <script src="https://cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js"></script>
  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css">
  <link rel="stylesheet" type="text/css" href="https://datatables.net/media/css/site-examples.css">
  <style>
    .boxed {
      border: 1px solid grey;
      padding: 2px;
      margin: 0 2px;
    }
  </style>
</head>

<body>

<div style="margin: 20px;">

<table id="example" class="display dataTable cell-border" style="width:100%">
  <thead>
   <tr><th>Animal</th><th>Color</th></tr>
  </thead>
  <tbody>
    <tr><td>antelopes</td><td><span class="boxed">blue</span><span  class="boxed">green</span></td></tr>
    <tr><td>elephants</td><td><span class="boxed">red</span><span  class="boxed">yellow</span></td></tr>
    <tr><td>hounds</td><td><span class="boxed">blue</span><span  class="boxed">green</span></td></tr>
    <tr><td>kittens</td><td></td></tr>
    <tr><td>lions</td><td><span class="boxed">blue</span></td></tr>
    <tr><td>ravens</td><td><span class="boxed">black</span></td></tr>
    <tr><td>whales</td><td><span class="boxed">red</span><span  class="boxed">green</span></td></tr>
    <tr><td>zebras</td><td><span class="boxed">blue</span></td></tr>
  </tbody>
  <tfoot>
   <tr><th>Animal</th><th>Color</th></tr>
  </tfoot>
</table>

</div>

<script type="text/javascript">

$(document).ready(function() {

  // DataTable
  var table = $('#example').DataTable();

  // Setup - add a text input to first footer cell
  $('#example tfoot th').slice(0, 1).each( function () {
    var title = $(this).text();
    $(this).html( '<input type="text" placeholder="Search '+title+'" />' );
  } );

  // Setup - add a select list to second footer cell
  $('#example tfoot th').slice(1, 2).each( function () {
    var html = buildDropdown();
    $(this).html( html );
  } );

  $('#colorSelect').change(function() {
    table.draw();
  });

  // Apply the input field search
  table.columns().every( function () {
    var that = this;

    $( 'input', this.footer() ).on( 'keyup change clear', function () {
      if ( that.search() !== this.value ) {
        that.search( this.value ).draw();
      }
    } );
  } );

  function buildDropdown() {
    var selectHtml;
    var items = [];
    table.columns([1]).data().each(function (d, j) {
      $( "span.boxed" ).each(function( index ) {
        var newItem = $( this ).text();
        if (items.indexOf(newItem) === -1) {
          items.push(newItem);
        }
      });
    });
    items.sort();
    //console.log(items);

    selectHtml = '<select id="colorSelect"><option value=""></option>';
    items.forEach(function(item) { 
      selectHtml = selectHtml + '<option value="' + item + '">' + item + '</option>';
    });
    selectHtml = selectHtml + '</select>';

    return selectHtml;
  }

  $.fn.dataTable.ext.search.push(
    function( settings, data, dataIndex ) {
      var selectedValue = $('#colorSelect').val();
      if (data[1].includes(selectedValue)) {
        //console.log("match!");
        return true;
      } else {
        return false;
      }
    }
  );

} );


</script>

</body>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2023-03-22
    • 1970-01-01
    • 2014-06-27
    • 2020-01-27
    • 2019-02-15
    相关资源
    最近更新 更多