【问题标题】:JqGrid update data from serverJqG​​rid 从服务器更新数据
【发布时间】: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 秒后替换所有内容。

提前致谢

【问题讨论】:

    标签: javascript jquery asp.net-mvc jqgrid


    【解决方案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 更新另一个页面上的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2016-10-01
    相关资源
    最近更新 更多