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

Sorting a DataTable using custom function does not work

我在 JavaScript 与 DataTables plug-in 一起工作。

通常,如果我需要更新单元格值,我会使用 cell().data(set) method followed by .draw().

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

当我想要对 table 进行排序时,这是一个问题。实际上,排序是对数据table已知的数据进行的,数据没有变化。

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

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

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

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

尝试 this JSFiddle,单击 "CHANGE VALUES" 按钮并尝试对列进行排序,您可以看到值的排序不正确。

有几个解决方案:

SOLUTION #1

使用cell().invalidate()API方法使缓存中的数据失效如下图:

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

演示版

有关代码和演示,请参阅 this jsFiddle

SOLUTION #2

您可以使用 columns.orderDataType to specify name of custom ordering plug-in, see Custom data source sorting。这些插件可以访问实时 DOM 内容。 请注意,DataTables 中没有内置插件,它们必须单独添加。

可以使用dom-text插件为基础,自己编写函数访问数据进行排序

演示版

有关代码和演示,请参阅 this jsFiddle