使用自定义函数对DataTable进行排序不起作用

时间:2015-09-23 19:19:36

标签: javascript jquery datatables datatables-1.10

我在JavaScript中使用DataTables plug-in

通常,如果我需要更新单元格值,我会使用cell().data(set)方法,后跟.draw()

但是,我不想使用这种方式,因为我的表包含繁重的DOM对象。所以,当我需要更新一个单元格时,我只是调用一些jQuery,例如$("#cell").attr("myattr", 50),然后我设法永远不必使用draw()。这可以防止每次重建对象,但不幸的是,这也意味着DataTable不知道这些更改(cell().data()返回未更改的对象)。

当我希望对表进行排序时,这是一个问题。实际上,对数据表已知的数据执行排序,数据不会更改。

所以我想我可以使用columns.render选项,实现这样的函数:

function(data, type, row, meta) {
    if (type === "sort") {
        return $("#cell").attr("myattr");
    }
    return data;
}

这不起作用,我认为这是因为DataTable caches the data。因此,由于我从不更新单元格数据,因此永远不需要更新缓存,并且使用此缓存完成排序,这与单元格myattr属性不对应。

我正在寻找一种解决方法,即使单元格值不是在内部更改,也不是从外部更改,我也可以对DataTable进行排序。

使用this JSFiddle,点击“更改价值”按钮并尝试对列进行排序,您可以看到值未正确排序。

1 个答案:

答案 0 :(得分:2)

有几种解决方案:

  

解决方案#1

使用cell().invalidate() API方法使缓存中的数据无效,如下所示:

$('#example').DataTable().cell($("#a").closest('td')).invalidate('dom').draw(false);

<强>样本

请参阅this jsFiddle以获取代码和演示。

  

解决方案#2

您可以使用columns.orderDataType指定自定义订购插件的名称,请参阅Custom data source sorting。这些插件可以访问实时DOM内容。 请注意,DataTables中没有内置插件,必须单独添加。

您可以使用dom-text插件作为基础并编写自己的函数来访问数据以进行排序。

<强>样本

请参阅this jsFiddle以获取代码和演示。