我正在与 DataTables plug-in 合作在 JavaScript 中。
通常,如果我需要更新单元格值,我会使用 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
属性不对应。
我正在寻找一种解决方法,即使单元格值不是在内部更改而是从外部更改,也可以让我对数据表进行排序。
玩this JSFiddle ,单击“更改值”按钮并尝试对列进行排序,您可以看到值的排序不正确。
最佳答案
有几个解决方案:
SOLUTION #1
使用cell().invalidate()
使缓存中的数据失效的API方法如下所示:
$('#example').DataTable().cell($("#a").closest('td')).invalidate('dom').draw(false);
演示
参见this jsFiddle用于代码和演示。
SOLUTION #2
您可以使用columns.orderDataType
要指定自定义排序插件的名称,请参阅 Custom data source sorting 。这些插件可以访问实时 DOM 内容。
请注意,DataTables 中没有内置插件,必须单独添加它们。
您可以使用dom-text
插件作为基础并编写自己的函数来访问数据进行排序。
演示
参见this jsFiddle用于代码和演示。
关于javascript - 使用自定义函数对 DataTable 进行排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32747781/