JqGrid 从服务器更新数据
Posted
技术标签:
【中文标题】JqGrid 从服务器更新数据【英文标题】:JqGrid update data from server 【发布时间】:2016-10-10 06:08:06 【问题描述】:我们正在使用 jgGrid,它工作得非常好。让我解释一下网格是如何设置的,我们正在从服务器获取 json 数据,loadonce: true。
现在我们要每 20 秒更新一次网格,所以
setInterval(function ()
$("#jqGrid").setGridParam( datatype: 'json', page: 1 ).trigger('reloadGrid', [ current: true ]);
, 20000);
这工作正常。问题是,它完全刷新了网格,我们想要更新被改变的数据。我的意思是如果一列中只有一个单元格发生了变化,那么只有那个单元格应该被改变。
刷新整个网格会导致排序和搜索过滤器出现问题。它会在 20 秒后替换所有内容。
提前致谢
【问题讨论】:
【参考方案1】:解决问题的最简单方法是使用beforeProcessing
回调,如果数据未更改,则返回false
。如果从服务器返回的数据未更改(与之前的响应相比),它将防止重新加载网格。我在the answer 中详细描述了该场景。主要问题是:如何判断返回的数据是否相同。在引用的旧答案中,我根据服务器端的数据计算了 MD5 缓存并将值设置为Etag
。或者,您可以使用CryptoJS 在客户端进行计算。 beforeProcessing
回调的 3-d 参数是 jqXHR
,它是 XMLHTTPRequest 对象的超集。它包含例如responseText
属性,它简化了MD5 计算。通过使用jqXHR.getResponseHeader("ETag")
,您可以访问ETag
HTTP 标头。
重新加载整个网格通常不会出现性能问题。重要的是,网格的 one 单元格的修改遵循reflow 或可能更改页面上其他元素的位置。整个网格的重新加载实现为一个分配网格的<tbody>
(如果您使用正确填充网格并且使用gridview: true
选项)。这似乎有很多额外的工作,但在实践中可能会更快,因为在网格的多行中顺序更改多个单元格。
无论如何,我建议您从实现beforeProcessing
回调开始,如果服务器数据未更改,它将返回false
。只有当您遇到一些真正的性能问题时,您才应该详细分析性能问题,并可能对现有代码进行更深入的更改。
【讨论】:
感谢您的评论。我会尝试实现 beforeProcessing 回调 @JohnyBravo:不客气!我在回答中写道,使用setRowData
重新加载 jqGrid 可能会更有效。此外,您的问题中没有包含足够的细节。例如,您使用rowNum: 5, loadonce: true
并尝试使用setRowData
更新数据。它仅适用于当前页面上的数据。如果在另一个页面上更改了数据,那么setRowData
将不起作用。此外,更改另一个页面上的数据并重新加载可能会更改行的顺序(基于sortname
),setRowData
的解决方案将无法正常工作。
感谢您的意见。 Yes 仅适用于当前页面上的数据。我们可以使用 setRowData 做些什么吗,它会更新当前页面上的值,但在其他页面上它不会刷新值
@JohnyBravo:您可以使用getLocalRow
更新另一个页面上的数据。以上是关于JqGrid 从服务器更新数据的主要内容,如果未能解决你的问题,请参考以下文章
JqGrid 根据另一个 jqgrid 下拉列表中的选定数据在下拉列表中添加值