【问题标题】:How to apply filter to specific datatable如何将过滤器应用于特定的数据表
【发布时间】:2012-07-11 23:21:11
【问题描述】:

是否可以将某个过滤器仅应用于一个数据表? 我在准备好文档时应用了以下过滤器功能,我不知道这是否是正确的程序,但作为副作用,所有数据表都会受到过滤器的影响。我只想影响 $('#productTable'),但这个选择器似乎没有预期的效果。

//Filter Function in Stock 
//$('#productTable').
$.fn.dataTableExt.afnFiltering.push(function(oSettings, aData, iDataIndex) {
    var checked = $('#instock').is(':checked');
    var qntStock = 1; 
    var stockCol = 3; 

    if (!checked) {
        return true;
    }
    if (checked && aData[stockCol] > qntStock) {
        return true;
    }

    return false;
 });

是否可以仅对特定表应用过滤器?我该如何做到这一点?

编辑:

数据表初始化:

var oTable = $('#productTable').dataTable({
        "aoColumnDefs": [{
            "sClass": "my_class", 
            "aTargets": [4]
            }],
        "bAutoWidth": false,
        "iDisplayLength": 100,
        "fnDrawCallback": function() {
            $("td.my_class").editable(function(value, settings) 
            { 
                return(value);
            }, 
            {
                indicator : 'Save...',
                tooltip   : 'Click to Edit...'
            }
            );
        }
    });

【问题讨论】:

  • 您使用的是 ajax 源,还是 html/array 等的一部分?
  • 数据从本地web sql加载到浏览器
  • 能否添加用于初始化数据表的代码?
  • 确定添加了。任何提示表示赞赏。
  • 最后一件事,我保证 :) 您是否在代码中的任何位置调用该函数 (fnFiltering.push)?如果是这样,只需粘贴该块:D

标签: javascript jquery jquery-plugins datatables


【解决方案1】:

您可以创建一个表数组来进行过滤 - 然后在您的过滤器中检查当前表是否存在于该数组中......类似于:

// setup an array of the ids of tables that should be allowed
var allowFilter = ['productTable'];

$.fn.dataTableExt.afnFiltering.push(function(oSettings, aData, iDataIndex) {

    // check if current table is part of the allow list
    if ( $.inArray( oSettings.nTable.getAttribute('id'), allowFilter ) == -1 )
    {
       // if not table should be ignored
       return true;
    }
    var checked = $('#instock').is(':checked');
    var qntStock = 1; 
    var stockCol = 3; 

    if (!checked) {
        return true;
    }
    if (checked && aData[stockCol] > qntStock) {
        return true;
    }

    return false;
});

【讨论】:

  • 我使用了一个更简单的版本,因为我只想过滤一个表,但这将以更通用的方式工作。
  • 这对我不起作用,oSettings.nTable 必须是 oSettings.nTable.getAttribute('id')
  • 直接使用 oSettings 变量 (oSettings.nTable.getAttribute('id')) 是 discouraged,因为它的内容是 API 私有的,并且可能会在版本之间更改而不会发出警告。使用var api = new $.fn.dataTable.Api( settings );,然后使用var tableId = api.table().node().id;访问表的id
【解决方案2】:

你可以这样做: 在配置中添加参数:

var oTable = $('#productTable').dataTable({
        "applyFilter":true,
        "aoColumnDefs": [{
            "sClass": "my_class", 
            "aTargets": [4]
            }],
        "bAutoWidth": false,
        "iDisplayLength": 100,
        "fnDrawCallback": function() {
            $("td.my_class").editable(function(value, settings) 
            { 
                return(value);
            }, 
            {
                indicator : 'Save...',
                tooltip   : 'Click to Edit...'
            }
            );
        }
    });

然后,验证您的过滤器是否处于活动状态:

//Filter Function in Stock 
//$('#productTable').
$.fn.dataTableExt.afnFiltering.push(function(oSettings, aData, iDataIndex) {
    if(oSettings.applyFilter)
    {
        var checked = $('#instock').is(':checked');
        var qntStock = 1; 
        var stockCol = 3; 

        if (!checked) {
            return true;
        }
        if (checked && aData[stockCol] > qntStock) {
            return true;
        }

        return false;
    }
    else
        return true;
 });

【讨论】:

    【解决方案3】:

    原来过滤是全局的,而且确实你必须过滤表格元素……这很令人失望。

    【讨论】:

    • 过滤是全局的,但您可以使用 ServerSideProcessing 绕过它。如果使用 C#、PHP 或 w/e 语言,则可以通过 ajax 调用传递过滤器参数,并返回已过滤的数据。我已经这样做了很多次了,它比常规过滤要快得多(在大行上)。
    • 你看我的回答了吗?还有我给的链接...?
    【解决方案4】:

    没试过,不过这样的怎么样?

    $.fn.dataTableExt.afnFiltering.push(
    function( oSettings, aData, iDataIndex ) {
            if ( oSettings.nTable == document.getElementById( 'productTable' )){
                var checked = $('#instock').is(':checked');
                var qntStock = 1; 
                var stockCol = 3; 
    
                if (!checked) {
                    return true;
                }
                if (checked && aData[stockCol] > qntStock) {
                    return true;
                }
    
                return false;
            }
    }
    );
    

    这个想法来自这个帖子:2 datatables & 2 filters on the same page


    您也可以试试 my yadcf plugin for datatable,这里是 showcase url,它有 9 种不同类型的过滤器 + 额外的 API 函数可以帮助您加载预先过滤的表格或添加单个过滤器过滤多个表和许多其他很酷的东西..

    【讨论】:

      【解决方案5】:

      这就是我们所做的:

                  var temporarilySetFilterFunctions = $.fn.dataTableExt.afnFiltering;
                  $.fn.dataTableExt.afnFiltering = [function (settings, data, index) {
                      // our filter function
                  } ];
      
                  this._table.dataTable().fnDraw(); // filter!
      
                  $.fn.dataTableExt.afnFiltering = temporarilySetFilterFunctions;
      

      基本上将现有过滤器存储在 TEMP 变量中,然后在完成后将其还原。艾伦的奇怪设计决定是这样实现的。丑陋的黑客,但它的工作原理。

      【讨论】:

        【解决方案6】:

        以下链接将有助于将过滤器应用于数据表。 http://live.datatables.net/oyinin/3/edit#javascript,html

        我是这样使用的:

          drawTable = function (tableId, url,    stateEngineURL) {
                resUrl = url;
                sUrl = stateEngineURL;
                oTable = $('#' + tableId).dataTable({
                    "bAutoWidth" : false,
                    "bProcessing" : false,
                    "bServerSide" : false,
                    "sScrollY" : "150px",
                    "bPaginate" : true,
                    "bDeferRender" : true,
                    "bScrollInfinite" : true,
                    "bSortCellsTop" : true,
                    "sAjaxSource" : url,
                    "aoColumns" : [
                        {
                            "mDataProp" : "clusterName"
                        }, {
                            "mDataProp" : "type"
                        }, {
                            "mDataProp" : "actions",
                            "bSortable": false
                        }
                    ],
                    "fnServerData": function (sSource, aoData, fnCallback) {
                        aoData.push({"name" : "REQUESTTYPE", "value" : "getCredentialResrcURL" });
                        $.getJSON(sSource, aoData, function (json) {
                            fnCallback(json);
                        });
                    },
                    "fnRowCallback" : function (nRow, aData) {
                        onRowCallBack(nRow, aData);
                    }
                });
                oTable.dataTableExt.afnFiltering.push(
                        function( oSettings, aData, iDataIndex ) {
                           if(aData.type=='OSS 5.x'){
                               return false;
                           }
                        }
                    );
                oTable.fnDraw();
        

        【讨论】:

          猜你喜欢
          • 2019-10-01
          • 2011-11-01
          • 2017-08-10
          • 2017-02-02
          • 2014-01-18
          • 1970-01-01
          • 2021-04-06
          • 2021-03-01
          • 2022-11-03
          相关资源
          最近更新 更多