我正在使用Datatables来显示一些数据。我还有用于向数据添加新行的输入。当我添加这一行时,我重新初始化表,它会根据我给出的排序规则自动对新行进行排序。我的问题是:有没有办法按照当前正在查看的顺序从表中获取数据?每当我尝试
$('#tableCompetitors').dataTable().fnGetData()
,
它按照它被添加到表中的顺序给我数据,而不是它被呈现的有序数据。
那么有一种简单的方法可以做我想要的吗?
P.S。如果它有帮助。原始数据源是从文本框提供的数组数组。我解析它,将它推送到一个数组,然后使用该数组作为数据源。
答案 0 :(得分:8)
以下是一个使用3个API回调的解决方案。
CurrentData
CurrentData
以清空fnPreDrawCallback
内的数组,该数组在呈现新表之前触发fnRowCallback
可以访问每一行的数据,将该数组推送到CurrentData
数组fnDrawCallback
触发,现在可以访问CurrentData
数组中的已排序数据JS
var currData = [];
$('#example').dataTable({
"fnPreDrawCallback": function(oSettings) {
/* reset currData before each draw*/
currData = [];
},
"fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {
/* push this row of data to currData array*/
currData.push(aData);
},
"fnDrawCallback": function(oSettings) {
/* can now access sorted data array*/
console.log(currData)
}
});
答案 1 :(得分:8)
我遇到了同样的问题。虽然接受的解决方案可行,但我找到了更好的方法:
$("example").DataTable().rows({search:'applied'}).data()
有关详细信息,请参阅selector-modifier文档。
答案 2 :(得分:2)
试图给你另一种选择。
以下内容将获取表中的所有行,即使它们已被过滤掉:
var currData = [];
var oTable = $('#example').dataTable();
oTable.$("tr").each(function(index, row){
//generate your array here
// like $(row).children().eq(0) for the first table column
currData.push($(row).children().eq(0));
// return the data in the first column
currData.push($(row).children().eq(0).text());
});
或者如果您只想要与过滤器匹配的结果:
var currData = [];
var oTable = $('#example').dataTable();
oTable.$("tr", {"filter":"applied"}).each(function(index, row){
//generate your array here
// like $(row).children().eq(0) for the first table column
currData.push($(row).children().eq(0));
// return the data in the first column
currData.push($(row).children().eq(0).text());
});
currData将包含第一列数据的排序列表。
编辑: 将整行的文本放入数组中。
$(row + " td").each(function(index, tdData){
currData.push($(tdData).text());
});
或
$(row).children().each(function(index, tdData){
currData.push($(tdData).text());
});
通过这种方式,您可以更好地控制数组可以包含的内容。我的2美分。