使用数据表按两列排序(无法读取未定义的 属性 'sType')

Sort by two columns with dataTables (Cannot read property 'sType' of undefined)

我正在使用 dataTables plugin 来处理列的排序。

尝试应用 multi-column ordering 我在控制台中收到以下错误:

Uncaught TypeError: Cannot read property 'sType' of undefined

由于文档在这方面的解释不是很清楚,并且没有包含太多关于此功能的示例,所以我不知道问题出在哪里。

Reproduction of the problem

$('#demo').DataTable({
    paging: false,
    ordering: true,
    columnDefs: [{
        orderData: [[0, 'asc'],[1, 'asc']],
        targets: [1]
    }]
});

原因

选项columns.orderData应该是索引数组,见下文:

$('#demo').DataTable({
    paging: false,
    ordering: true,
    columnDefs: [{
        orderData: [0, 1],
        targets: [1]
    }]
});

请参阅 updated JSFiddle 进行演示。

尽管 多列排序 示例页面提到您可以使用 [ [0,'asc'], [1,'asc'] ],但是它与 columns.orderData 的手册相矛盾。

似乎是代码或手册的问题。通过查看 DataTables 源代码,我发现它只接受没有排序方法的索引数组。

详情

针对此问题为 jQuery DataTables 创建了一个 new issue #591

现在是 confirmed that the issue was with incorrect statement on Multi-column ordering 示例页面。

解决方法

解决方法是绑定到 order event and re-order the table as you want with order() 方法,该方法除了接受列索引外还接受排序方法。

var table = $('#demo').DataTable({
    paging: false,
    ordering: true
});

$('#demo').on('order.dt', function(){
   var order = table.order();              
   if(order[0][0] === 1){
      table.order([0, 'asc'],[1, 'asc']).draw();
   }
});

请参阅 this JSFiddle 进行演示。

似乎多列顺序可以在dataTables中工作,有:

  • 默认启用多排序
  • 具有忽略用户输入的固定升序的第一列
  • 用户可以选择排序方向的第二列
  • 无需按住 Shift 键并单击即可保持多重排序

所有过程总结如下:

    $('#demo').DataTable({
    ordering: true,         
    order:[[0, 'asc'],[1, 'asc']], // Set initial order
    orderFixed: [ 0, 'asc' ], // Always use the first column for ordering
    "columnDefs": [
    { "orderable": false, "targets": 0 } // Don't let the first column order to be changed
      ]
    });

看到它工作 here