【问题标题】:Jquery DataTables custom sort plugin not workingJquery DataTables自定义排序插件不起作用
【发布时间】:2014-11-14 07:27:14
【问题描述】:

我正在尝试创建一个插件来更改列的排序行为。列中的数据是<ul> 元素。在列表的每个<li> 元素中,都有一些文本和一个十进制数。我想根据单元格列表中的最大十进制数对表格进行排序。这是一个显示插件的 jsfiddle,如您所见,当您对第二列进行排序时,它无法正常工作:

http://jsfiddle.net/flyingL123/1whzq1w2/3/

如果有效,降序应该是 Sam (97.50)、Joe (80.50)、Mike (17.50),升序当然应该是相反的。根据我的调试,插件为每个单元格返回正确的数值。你知道为什么表格不会被相应地排序吗?

这是插件的代码:

$.fn.dataTable.ext.order['number-list'] = function  ( settings, col )
{
    return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {

                    //get all numbers from the cell into an array and parseFloat each one
                    var nums = $(td).html().match(/(\d+.\d+)/);

                    if(nums){
                            nums = nums.map(function(val){return parseFloat(val, 10);});
                            return Math.max.apply(null, nums);
                    }
                    else{
                            return 0;
                    }
            } );
}

【问题讨论】:

    标签: jquery datatables


    【解决方案1】:

    注意:此答案已完全重写。

    关于 dataTables 自定义排序和自定义数据源
    最初的答案是 dataTables 所说的基于类型的排序。 dataTables 天生具有对基本“原语”或类型的排序功能:stringnumericdatehtml。默认情况下,dataTables 会尝试猜测一列包含什么类型的数据,然后用户单击表头,表会根据检测到的类型进行排序。您可以使用sType / type 选项(如sType : 'string')将类型强制为特定列,如果需要,或者如果dataTables 未检测到正确的类型。比如你想让列按数字排序,而dataTables按字母排序,那么你可以设置sType : 'numeric'

    显然,内置排序功能并不总能满足所有需求,就像在您的示例中一样。在这种情况下,您可以创建一个新的type,正如您在原始答案中看到的或在其他自定义排序插件中看到的那样。例如。在方案type-pretype-desctype-asc 之后向oSort 添加一个对象。这些函数定义不是强制性的,但那些 dataTables 会响应。例如type-pre - 预处理函数 - 不是强制性的,但如果在调用实际排序函数之前内容需要特殊处理,则非常有用。

    dom-text(和类似的)基本上是一个独立的type-pre。如果您只希望排序算法对列内容的某个部分进行排序,而不需要全新的排序算法,这将很有用。 dataTables 将其定义为custom data source sorting。例如,如果您有一个名称列,例如 firstname lastname,但想要在 lastname 上进行排序,那么这就是要走的路。

    很好的是,您可以将以上所有内容结合起来。默认排序、默认类型检测、强制类型、自定义排序插件和自定义数据源。

    在这里我们有尴尬的部分:(我自己有很多需要特殊排序算法的情况,所以我一直所以习惯于将自定义排序插件拼凑在一起,我只是忽略了你试图做的事情:(我真的不记得确切的情况了,但显然我在早上 9 点喝咖啡时看到了你的问题,然后用自动驾驶仪上的自定义排序插件回答。

    我明白你为什么想知道 - 你是绝对正确的。您问题中的代码也是正确的。考虑一下我上面写的:您需要的是custom data source 和内置排序类型numeric 的组合。真正的答案是你离得太近了,你只是忘了设置type,这是必要的,因为默认的排序类型是string。所以

    var myDataTable = $('#myTable').DataTable({
      "columns":[
           null,
           {"orderDataType":"number-list", type: 'numeric'} // <--- just set the type to numeric
       ],
       "order":[],
    });
    

    就是这样!这是你原来的小提琴 -> http://jsfiddle.net/rd0p6ts8/

    很抱歉给您带来了困惑。无论如何,希望您会接受答案。

    【讨论】:

    • 这行得通,但我不清楚它为什么行得通。我也在使用dom-text 插件在这里找到:datatables.net/plug-ins/sorting/custom-data-source/dom-text。为什么这个定义不同?我的印象是,我尝试实现的自定义排序与 dom-text 插件正在做的事情相同。那么为什么它的定义不同呢?
    • @flyingL123 - 完全重写了答案。了解你为什么想知道。即使我的答案有效,但关于功能,它并不是真正的答案,因为真正的答案非常简单,无需创建新的排序算法。一个好的答案必须以自己的方式解决问题,而不是重新发明轮子。显然,当我做第一个答案时我并没有考虑:(
    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多