【问题标题】:Getting a jqGrid with postData filter on initial load to only display client-side filtered rows在初始加载时获取带有 postData 过滤器的 jqGrid 以仅显示客户端过滤的行
【发布时间】:2016-03-01 21:43:08
【问题描述】:

我们有一个 jqGrid,它最初通过内置的 ajax fetch 返回一个 json 对象来获取它的行。然后,我们使用自定义函数在客户端进行过滤/搜索以构建 postData 过滤器,然后使用它们来设置 filterToolbar 小部件以匹配。

我们的问题是,对于某些用例,初始页面加载将设置 postData 过滤器,但网格不会对它们起作用。例如,我们可能有一个“column A='foo' AND column B='bar'”的过滤器,并且在初始页面加载时,filterToolbar 小部件会反映这一点,但网格会显示所有行。为了让网格对 postData 过滤器起作用,我们必须使网格重新加载。这会产生视觉 UI 工件,我们的用户会看到完整的网格,半秒后网格会更新以仅显示过滤后的行。

本质上,我们正在做的是

loadcomplete: function (data) {
  if (ifirstTime) {
    // at this point jqGrid("getGridParam", "postData") contains filters set from cookies
    $grid.jqGrid("setGridParam", { datatype: "local" });
    setTimeout(function () {
      $this.trigger("reloadGrid");
    }, 100);
    firstTime = false;
}
// the grid shows all rows now.  after the timeout above fires the 
// grid will be updated to show the filtered rows only.

我们已经尝试在beforeProcessing 事件中手动设置 jqGrid 数据以及一些其他技巧来尝试避免重新加载网格。看起来能够调用隐藏在 jqGrid 中的 populate() 方法可能会有所帮助,但要获得能够调用它的上下文一直是一个挑战。

我遇到的大多数其他答案都与服务器端过滤有关,而客户端的少数答案似乎满足于这种网格重新加载方法。

当数据类型为json 时,是否有任何方法让jqGrid 通过其正常方法加载其数据,然后在初始网格渲染之前应用客户端postData 过滤器。我们希望过滤后的网格是用户首先看到的,而不是最初看到未过滤的网格。

对于存在postData 过滤器的情况,隐藏第一个网格视图(包含所有行)的任何替代方法也将有助于解决问题。

【问题讨论】:

    标签: javascript jqgrid client-side


    【解决方案1】:

    您对问题的描述非常好。只有在 jqGrid 中进行更深入的更改才能解决这个问题。

    我开发free jqGrid fork 从主 jqGrid 存储库的许可协议开始在版本 4.7.1 中进行了更改,并且 jqGrid 在 Guriddo jqGrid JS 中重命名(参见 the post Guriddo jqGrid JS 的价格 here)。从 2014 年底开始免费 jqGrid 项目开始,我重写了 jqGrid 的许多旧部分。重写后有些功能实现起来比较容易。

    如果您要将当前的 jqGrid 替换为免费的 jqGrid,那么您可以使用新选项 forceClientSorting: trueloadonce: true 结合使用。 jqGrid将显示第一页之前应用客户端排序和过滤数据的选项强制。以这种方式,您可以从某些公共源加载任何 JSON 数据,例如您无法在服务器端更改任何内容,然后在客户端应用所需的过滤和排序。您应该从loadComplete 中删除旧技巧,所有技巧都应该直接起作用。

    顺便说一句,使用免费 jqGrid 最简单的方法是从 CDN 加载它。见the wiki article

    【讨论】:

    • 感谢您的快速回复!您的免费 jqGrid 分支中的那个选项正是我们所需要的。但是,使用您的免费 jqGrid 在 IE 11 中的网格水平滚动中引入了许多“滞后”,因为样式计算应用于网格中的每个单元格(在 Chrome 中不会发生)。这是您以前从旧的 jqGrid 过渡到 jqGrid 的过程中看到的吗?
    • @casey:不客气!对不起,但我不明白你的“滞后”是什么意思。我更改了一些参数的免费 jqGrid 默认值,以便减少误解,特别是对于新用户。它允许通过很少的选项使用 jqGrid(参见演示 here)。例如,height 的默认值现在是"auto"datatype 的默认值将是"local" *如果指定了data 参数。如果未指定data 参数,则datatype 的默认值将是旧的"xml",除非jsonReader
    • 简而言之,滞后是在网格主体和标题之间的滚动没有同时在视觉上发生。从滚动开始,在调用 free jqGrid 中的 scrollGrid 方法和更新页眉(和页脚)scoll 位置之前有很大的时间(大约一秒钟)。这似乎是与 IE 11 的样式交互,因为它的分析器报告它正在计算滚动时网格中每个网格单元(2000 左右)的样式。
    • @casey: 抱歉,我还是不能关注你,可能我不知道你使用 jqGrid 的方式和选项。一些代码或至少一些图片可能有助于理解您的意思。会不会是您使用虚拟滚动(scroll: 1scroll: true)?从 TreeGrid、数据分组、数据透视表、子网格等开始,jqGrid 可能会非常困难。一个可以使用datatype: "local",“xml”,“json”,“jsonp”,一个可以使用loadonce: true等等。如果我不知道您在上面使用了什么(以及许多其他功能),真的很难理解您。
    • 我现在不在代码前面,但我认为我们没有使用虚拟滚动,也没有像树或子网格那样花哨的东西。它也与 IE 11 隔离,此时认为这是他们的性能错误,而不是您的代码。感谢您提供上述信息。
    猜你喜欢
    • 2012-04-03
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多