我在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,点击“更改价值”按钮并尝试对列进行排序,您可以看到值未正确排序。
答案 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以获取代码和演示。