【问题标题】:Fixed rows sorting in datatables修复了数据表中的行排序
【发布时间】:2012-03-30 08:58:36
【问题描述】:

我想在数据表的头部建立一些固定的行。

这是我的数据表设置:

var oTable = $('#transactions').dataTable( {
    "aaSorting": [ [0,'desc'] ],
    "bFilter": false,
    "bSort": true, 
    "aaSorting": [[3,'desc']], // default search colums
    //            "aaSortingFixed": [[3,'desc']],
    "bPaginate": true,
    "bProcessing": true,
    "sPaginationType": "full_numbers",
    "asStripeClasses": [ 'monitoring-table-new' ],
    "bAutoWidth": false,
    "aoColumns": [
        {   "sType": "custom",
            "sClass": "td-date-size-cell",
            "fnRender": function ( oObj, sVal ) {
                return '<div class="monitoring-head-new leadencolor"><div class="form-border"><span class="date"><em>' + sVal + '</em></span></div></div>';
            }
        },
        {   "sType": "custom",
            "sClass": "td-transaction-size-cell",
            "fnRender": function ( oObj, sVal ) {
                return '<div class="monitoring-head-new leadencolor"><div class="form-border"><span class="transaction"><em>' + sVal + '</em></span></div></div>';
            }
        },
        {   "sType": "custom",
            "sClass": "td-client-size-cell",
            "fnRender": function ( oObj, sVal ) {
                return '<div class="monitoring-head-new leadencolor"><div class="form-border"><span class="client"><div>' + sVal + '</div></span></div></div>';
            } 
        },
        {   "sType": "custom",
            "sClass": "td-value-size-cell",
            "fnRender": function ( oObj, sVal ) {
                return '<div class="monitoring-head-new leadencolor"><div class="form-border"><span class="value"><em>' + sVal + '</em></span></div></div>';
            }
        },
        {   "sType": "custom",
            "sClass": "td-status-size-cell",
            "fnRender": function ( oObj, sVal ) {
                return '<div class="monitoring-head-new leadencolor"><div class="form-border"><span class="status"><div>' + sVal + '</div></span></div></div>';
            }
        },
    ],
    "sAjaxSource": '<?php echo url_for('@test?sf_format=json'); ?>',  

} );

我的做法如下:

   jQuery.fn.dataTableExt.oSort['custom-asc']  = function(x,y) {
        if (x.indexOf("MY VALUE") != -1) return -1; // keep this row at top
        if (y.indexOf("MY VALUE") != -1) return 1; // keep this row at top

        return ((x < y) ? -1 : ((x > y) ?  1 : 0));
    };

    jQuery.fn.dataTableExt.oSort['custom-desc'] = function(x,y) {
        if (x.indexOf("MY VALUE") != -1) return 1; // keep this row at top
        if (y.indexOf("MY VALUE") != -1) return -1; // keep this row at top

        return ((x < y) ?  1 : ((x > y) ? -1 : 0));
    };

这将使文本中包含“MY VALUE”的行保持在顶部。但问题是,当我对其他列进行排序时,“固定”行并未保留在表格顶部。

有什么解决办法吗?

【问题讨论】:

  • 你能在 jsfiddle 或 jsbin 上发一个例子吗?
  • 这是jsbin中的代码示例-jsbin.com/eroyac/2

标签: javascript sorting rows jquery-datatables


【解决方案1】:

只是不要排序。像这样使用tfoot -

<thead> ... </thead>
<tfoot style="display: table-row-group"> ... </tfoot>
<tbody> ... </tbody>

【讨论】:

    【解决方案2】:

    这并不容易,您可以做的一件事是将自定义排序与自定义数据源的custom datasource sorting 混合使用

    // var oTable;
    var onTopValues = new Array("Litige", "5410");
    
    /*  disable asc sorting for specific rows */
    jQuery.fn.dataTableExt.oSort['custom-asc']  = function(x,y) {
    
            if (isOnTop(x)) return -1; // keep this row at top
            if (isOnTop(y)) return 1; // keep this row at top
    
            return ((x < y) ? -1 : ((x > y) ?  1 : 0));
    };
    
    jQuery.fn.dataTableExt.oSort['custom-desc'] = function(x,y) {
            if (isOnTop(x)) return -1; // keep this row at top
            if (isOnTop(y)) return 1; // keep this row at top
    
            return ((x < y) ?  1 : ((x > y) ? -1 : 0));
    };
    
    function isOnTop(s) {
            // search for on top values
            for (var i = 0; i < onTopValues.length; i++) {
              if (s === onTopValues[i]) {
                return true; 
              }
            }
    
            return false;
    }
    //custom datasource
    $.fn.dataTableExt.afnSortData['custom-ontop'] = function  ( oSettings, iColumn )
    {
      var aData = [];
      //prepare the data
      $('td:eq('+iColumn+')',  oSettings.oApi._fnGetTrNodes(oSettings)).each(function(){
        //If the last column of this row should stay on top, return the value of the 
        //last row as datasource
        if(isOnTop($(this).closest('tr').find('td:last').text())){
           aData.push($(this).closest('tr').find('td:last').text());
        }else{
            //otherwise return this row as datasource
             aData.push($(this).text());
        }
      });
    
      return aData;
    };
    
    
    $(document).ready(function() {
    
              /* Apply custom classes to table headers */
            $.fn.dataTableExt.oStdClasses.sSortAsc = "custom_asc";
            $.fn.dataTableExt.oStdClasses.sSortDesc = "custom_desc";
    
    
      oTable = $('#transactions').dataTable({       
            "aoColumnDefs": [ { aTargets: [0,1,2,3], sType: "custom"}] ,
             "aoColumns": [
                    { "sSortDataType": "custom-ontop" },
                    { "sSortDataType": "custom-ontop" },
                    { "sSortDataType": "custom-ontop" },
                    { "sSortDataType": "custom-ontop" },
                    { "sSortDataType": "custom-ontop" }
                ],
            "aaSorting": [],
            "aaData": [
                [ "2012-01-2", "2", "Local <br>0312313213", 20, "Litige" ],
                [ "2012-03-22", "25", "Local <br>35313313213", 5540, "Valid" ],
                [ "2012-01-2", "2", "Local <br>0312313213", 10, "Valid" ],
                [ "2012-03-22", "25", "Local <br>35313313213", 5410, "Valid" ]
            ]
        });    
    });
    

    基本上,您仍在使用排序功能,但您向它们传递了一个自定义数据源,该数据源强制值保持在顶部。这假设您正在对最后一列进行排序,但您可以向其中添加逻辑。

    http://jsbin.com/eroyac/4/edit#preview

    【讨论】:

    • 是的,这就是这样做的方法 - 在 DataTables 中,所有行都可以排序,除非您自定义排序,否则您不能“​​冻结”特定行(即始终位置 0)。因此,要更改行的排序,您需要根据需要自定义排序功能。 sType 和自定义排序函数可能仅对大多数情况就足够了,但您可以使用 aaSortingFixed、aDataSort 和各种其他选项来辅助排序。
    【解决方案3】:

    这样我可以锁定第一行,并且排序只影响该行之后的行。检查此页面以获取其他选项:http://datatables.net/reference/option/orderFixed

    $('#budgytbl').dataTable({
      "orderFixed": [ 0, 'asc' ]
    })
    <table id="budgytbl"...
    
    <tbody>
      <tr>
        <td></td>
        <td id="input-name"></td>
        <td id="input-parent"></td>	
      </tr>
    
      @foreach ($categories as $category)
      <tr>
        ...
      </tr>
      @endforeach
    ...

    【讨论】:

      【解决方案4】:

      我有一个更简单的解决方案。

      我在我的表中创建了第二个tbody,然后只移动我需要保留在另一个tbody 中的所有行,如下所示:

      initComplete: function() {
          var self = this;
      
          var api = this.api();
          api.rows().eq(0).each(function(index) {
              var row = api.row(index);
              if (row.data()...) { // condition here
                  var $row_to_persist = $(row.node());
                  var $clone = $row_to_persist .clone();
      
                  $(self).find('tbody:last').append($clone);
      
                  $total_row.remove();
                  row.remove();
                  api.draw();
              }
          });
      }
      

      【讨论】:

        猜你喜欢
        • 2018-12-15
        • 1970-01-01
        • 2014-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 2018-06-14
        相关资源
        最近更新 更多