Datatables - 如何在向 table 添加新数据时停止服务器端绘制事件
Datatables - How to stop the server side draw event when adding new data to table
我已经 table 从服务器端加载了数据,因为我必须为服务器端加载大量数据集。
var table = $('#table').DataTable({
"processing": true,
"serverSide": true,
"ajax" : { "url": "...", "type": "POST" },
"columns": [ {
"orderable": false,
"data" : 'id',
"render" : function( data, type, meta )
{ return '..'; }
},
{
"orderable": true,
"data" : ".."
},
{
"orderable": true,
"data" : "..",
"className": 'right-align'
},
{
"orderable": true,
"data" : "..",
"className": 'right-align'
},
{
"orderable": false,
"data" : 'id',
"defaultContent": "",
"className": 'center-align',
"render" : function(data, type, meta) {
return '..';
}
},
{
"orderable": false, // flags
"data" : {
'inserted' : 'inserted',
'deleted' : 'deleted'
},
"defaultContent": "",
"className" : 'center-align',
"render" : '..'
}
}
],
'order': [
[1, "asc"]
],
"language": {
"lengthMenu": '..'
}
});
而且我必须为此 table 提供过滤功能(很少有复选框会触发 post 更改请求)所以我将过滤器发送到后端并提供我的新数据集。
$.post(url, { 'filters' : data} , function(collection){
table.clear().draw();
table.rows.add(JSON.parse(collection));
table.columns.adjust().draw();
});
它总共触发了 3 个请求,一个是 post 请求,两个是绘制请求(因为我绘制了两次)。
根据服务器端处理,table 的每次抽取都会导致发出新的 Ajax 请求以获取所需数据。现在这个数据覆盖了我从过滤器获得的数据。
如何使用新数据集绘制 table?或者我怎样才能停止触发那些服务器端 ajax 请求。
我尝试了 preDrawCallback,它关闭了整个绘制功能。
$('#table').dataTable( {
"preDrawCallback": function( settings ) {
return false;
}
});
您可以使用 ajax.data 指定发送到服务器的自定义参数,请参阅下面的方法之一。
$('#example').DataTable({
"ajax": {
"url": "data.json",
"data": function (d){
d.example_select = $('#example-select').val();
}
}
});
ajax.data
每次 DataTables 从服务器请求数据时都会调用回调函数。
要在过滤器更改后从服务器重新加载数据,您可以使用 ajax.reload() 函数,例如:
$('#example-select').on('change', function(){
$('#example').DataTable().ajax.reload();
});
请参阅 this JSFiddle 进行演示。
我已经 table 从服务器端加载了数据,因为我必须为服务器端加载大量数据集。
var table = $('#table').DataTable({
"processing": true,
"serverSide": true,
"ajax" : { "url": "...", "type": "POST" },
"columns": [ {
"orderable": false,
"data" : 'id',
"render" : function( data, type, meta )
{ return '..'; }
},
{
"orderable": true,
"data" : ".."
},
{
"orderable": true,
"data" : "..",
"className": 'right-align'
},
{
"orderable": true,
"data" : "..",
"className": 'right-align'
},
{
"orderable": false,
"data" : 'id',
"defaultContent": "",
"className": 'center-align',
"render" : function(data, type, meta) {
return '..';
}
},
{
"orderable": false, // flags
"data" : {
'inserted' : 'inserted',
'deleted' : 'deleted'
},
"defaultContent": "",
"className" : 'center-align',
"render" : '..'
}
}
],
'order': [
[1, "asc"]
],
"language": {
"lengthMenu": '..'
}
});
而且我必须为此 table 提供过滤功能(很少有复选框会触发 post 更改请求)所以我将过滤器发送到后端并提供我的新数据集。
$.post(url, { 'filters' : data} , function(collection){
table.clear().draw();
table.rows.add(JSON.parse(collection));
table.columns.adjust().draw();
});
它总共触发了 3 个请求,一个是 post 请求,两个是绘制请求(因为我绘制了两次)。
根据服务器端处理,table 的每次抽取都会导致发出新的 Ajax 请求以获取所需数据。现在这个数据覆盖了我从过滤器获得的数据。
如何使用新数据集绘制 table?或者我怎样才能停止触发那些服务器端 ajax 请求。
我尝试了 preDrawCallback,它关闭了整个绘制功能。
$('#table').dataTable( {
"preDrawCallback": function( settings ) {
return false;
}
});
您可以使用 ajax.data 指定发送到服务器的自定义参数,请参阅下面的方法之一。
$('#example').DataTable({
"ajax": {
"url": "data.json",
"data": function (d){
d.example_select = $('#example-select').val();
}
}
});
ajax.data
每次 DataTables 从服务器请求数据时都会调用回调函数。
要在过滤器更改后从服务器重新加载数据,您可以使用 ajax.reload() 函数,例如:
$('#example-select').on('change', function(){
$('#example').DataTable().ajax.reload();
});
请参阅 this JSFiddle 进行演示。