在初始加载时获取带有 postData 过滤器的 jqGrid,以仅显示客户端过滤行

Getting a jqGrid with postData filter on initial load to only display client-side filtered rows

本文关键字:jqGrid 显示 过滤 客户端 过滤器 加载 获取 postData      更新时间:2023-09-26

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

我们的问题是,对于某些用例,初始页面加载将设置postData过滤器,但网格不会对它们起作用。 例如,我们可能有一个过滤器用于"列 A='foo' AND 列 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()方法可能会有所帮助,但是获得能够调用它的上下文一直具有挑战性。

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

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

存在筛选器的情况下隐藏第一个网格视图(包含所有行postData的任何替代方法也有助于解决方法。

你把这个问题描述得很好。这个问题只能通过jqGrid中更深入的改变来解决。

我开发了免费的jqGrid分支,从主jqGrid存储库的许可协议开始,在4.7.1版本中更改了jqGrid,并且在Guriddo jqGrid JS中重命名了jqGrid(请参阅Guriddo jqGrid JS的价格帖子)。从2014年底免费jqGrid项目的开始,我重写了jqGrid的许多旧部分。重写后,一些功能相对容易实现。

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

顺便说一下,使用免费jqGrid的最简单方法是从CDN加载它。请参阅维基文章。