仅在数据更改时刷新 DataTable

Posted

技术标签:

【中文标题】仅在数据更改时刷新 DataTable【英文标题】:Refresh DataTable only if data changed 【发布时间】:2018-07-20 08:00:57 【问题描述】:

我将 DataTables 与 serverside = true 一起使用。仅当服务器上的数据发生更改时,我才想重绘我的数据表。但是 table.ajax.reload() 在每次调用时都会重绘表格。

你能提供一个小例子吗?

    从服务器获取数据 检查数据是否已更改 用新数据重绘表格

基于 cmets 的 UPD:

我有简单的服务器端处理数据表。如果用户更改页面或排序或过滤或其他任何东西,则有 ajax 查询到服务器以接收新数据并重绘表。但是服务器上的数据可能会改变。例如,其他用户向数据库表中插入新行或更改某些内容。我想如果这发生在数据表中的数据会自动刷新。但这是罕见的事件。无需每 10 秒(或几秒)重绘所有数据。仅当服务器上的某些内容发生更改时才需要重绘。对服务器的查询很快。重绘很慢。

【问题讨论】:

也许我错过了收益。重绘表格是否有性能或其他问题?绘制表格不应该是服务器端处理的负担。 您是在尝试优化表格的呈现,还是优化网络带宽?无论哪种方式,我都不相信 DataTables 中存在此功能。 我正在尝试优化渲染。桌子很大,里面有图片。在旧电脑上渲染很慢。检查 json 字符串是否相等很快。 您的数据库中有更新时间戳吗?您需要做的第一件事是知道正在显示哪些行。一种选择是使用rows().ids()。您可以使用'page:'current''的selector-modifer,例如:$('#myTable).DataTable().rows(page: 'current').ids()。然后使用 ajax 查询那些IDs 的数据库。然后使用rows().data()获取比较。请提供有关您的数据的更多详细信息,我们可以提供更详细的答案。 我有简单的服务器端处理数据表。如果用户更改页面或排序或过滤任何其他内容,则 ajax 查询到服务器以接收新数据并重绘表。但是服务器上的数据可能会改变。例如,其他用户向数据库表中插入新行或更改某些内容。我想如果这发生在数据表中的数据会自动刷新。但这是罕见的事件。无需每 10 秒(或几秒)重绘所有数据。仅当服务器上的某些内容发生更改时才需要重绘。对服务器的查询很快。重绘很慢。 【参考方案1】:

这是一个很好的问题 - 我的 DataTables 中有按钮、输入等。当重绘发生时,可能会发生文本框失焦或误点击按钮等问题。为了避免这种情况,我将我的 DataTables 设置为仅在有来自服务器的新/更新数据时才重绘。

方法如下:

template.html

<!-- include lodash _ used to determine json equality -->
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>

script.js

// global variables that are updated with each new ajax reload call:
var last_response = ;
var redraw = false;

// DataTable init:
var table = $('<selector>').DataTable(
  
  // initial settings:
  "columns" : ["<the columns>"],
  ...      

  // override the dataSrc parameter to handle data upon receiving a new response:
  "ajax" : 
     "url" : "<the url>",
     "dataSrc": function(response) 
 
       // compare response to the last response using lodash:
       if (_.isEqual(last_response, response) redraw = false;
       else redraw = true;

       // set the last_response global variable:
       last_response = response; 

       // return appropriately formatted data:
       return data;
     
  
  // use the predraw callback to determine whether to draw or not:
  "preDrawCallback" : function() 

    // return true to draw or false to skip draw:
    return redraw;

  
   
);

【讨论】:

以上是关于仅在数据更改时刷新 DataTable的主要内容,如果未能解决你的问题,请参考以下文章

*仅*在数据库表更改时刷新 html 页面部分(添加行)

Yii 2:更改语言仅在刷新后工作

Rails 页面在每次刷新时更改翻译

React JS 仅在我刷新页面时读取道具数据

仅在执行所有 ajax 脚本时刷新页面

React 子组件仅在刷新时更新