修复了数据表中的行排序

Fixed rows sorting in datatables

本文关键字:排序 数据表      更新时间:2023-09-26

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

这是我的数据表设置:

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"的行保持在顶部位置。但问题是,当我对另一列进行排序时,"固定"行并没有保留在表的顶部。

有什么解决方案吗?

只是不要对它进行排序。使用类似的tfoot-

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

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

// 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

这样我就可以锁定第一行,排序只影响这一行之后的行。检查此页面以了解其他选项: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
...

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

我在表中创建了第二个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();
        }
    });
}