Datatables.net ajax.reload():如果不需要,避免重建 DOM
Datatables.net ajax.reload(): avoid rebuilding DOM if not necessary
我正在使用 DataTables.Net JS component 从服务器渲染数据(超时时重新加载)。
如果行实际上没有更改,是否有办法避免在 ajax.reload() 上重建 <TR>
s?我不希望 <TR>
的自定义 类 消失。
更新
这是我初始化组件的方式:
myTable = $('#myTable').dataTable(
{
'ajax':
{
'url': 'data', // Something like http://myserver/data
'dataSrc': '' // All data go right in the root of JSON.
}
...
根据 DataTable 站点上的 'Multiple selection' 示例,我的自定义 类 例如 .selected
。
此致,
不幸的是,dataTables 在每个 reload()
上清空了 table。因此在 dataSrc
回调中排除已经存在的行是不可能的。
但您可以自己执行 AJAX,并插入新行 "manually"(如果尚不存在)。我假设您正在使用 JSON 数据源,因此您可以使用 JSON.stringify
将现有行与新行进行比较。
这是一个使用 setInterval
的示例(包括 select):
var table = $('#example').DataTable({
select : true,
columns : [
{ "data" : "id" },
{ "data" : "name" },
{ "data" : "lat" },
{ "data" : "lon" }]
});
function loadData() {
$.getJSON('https://api.myjson.com/bins/14t4g', function(json) {
function rowExists(item) {
for (var i=0;i<table.data().length;i++) {
if (JSON.stringify(table.row(i).data()) == JSON.stringify(item)) return true;
}
return false;
}
json.forEach(function(item) {
if (!rowExists(item)) {
table.row.add(item).draw();
} else {
console.log('row already exists', item);
}
})
});
}
var test = setInterval(function() {
loadData()
}, 1000);
我正在使用 DataTables.Net JS component 从服务器渲染数据(超时时重新加载)。
如果行实际上没有更改,是否有办法避免在 ajax.reload() 上重建 <TR>
s?我不希望 <TR>
的自定义 类 消失。
更新
这是我初始化组件的方式:
myTable = $('#myTable').dataTable(
{
'ajax':
{
'url': 'data', // Something like http://myserver/data
'dataSrc': '' // All data go right in the root of JSON.
}
...
根据 DataTable 站点上的 'Multiple selection' 示例,我的自定义 类 例如 .selected
。
此致,
不幸的是,dataTables 在每个 reload()
上清空了 table。因此在 dataSrc
回调中排除已经存在的行是不可能的。
但您可以自己执行 AJAX,并插入新行 "manually"(如果尚不存在)。我假设您正在使用 JSON 数据源,因此您可以使用 JSON.stringify
将现有行与新行进行比较。
这是一个使用 setInterval
的示例(包括 select):
var table = $('#example').DataTable({
select : true,
columns : [
{ "data" : "id" },
{ "data" : "name" },
{ "data" : "lat" },
{ "data" : "lon" }]
});
function loadData() {
$.getJSON('https://api.myjson.com/bins/14t4g', function(json) {
function rowExists(item) {
for (var i=0;i<table.data().length;i++) {
if (JSON.stringify(table.row(i).data()) == JSON.stringify(item)) return true;
}
return false;
}
json.forEach(function(item) {
if (!rowExists(item)) {
table.row.add(item).draw();
} else {
console.log('row already exists', item);
}
})
});
}
var test = setInterval(function() {
loadData()
}, 1000);