JqG​​rid 从服务器更新数据

Posted

技术标签:

【中文标题】JqG​​rid 从服务器更新数据【英文标题】: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 更新另一个页面上的数据。

以上是关于JqG​​rid 从服务器更新数据的主要内容,如果未能解决你的问题,请参考以下文章

JqG rid寻呼机在每个页面中加载相同的数据

JqG​​rid 内联添加记录保存

JqG​​rid 根据另一个 jqgrid 下拉列表中的选定数据在下拉列表中添加值

JqG​​rid 如何更改编辑表单的宽度?

JqG​​rid 需要超链接 - 需要通过 Jquery 捕获价值

JqG rid重新排序searchBox中的元素?