在初始加载时使用postData过滤器获取jqGrid仅显示客户端过滤的行

时间:2016-03-01 21:43:08

标签: javascript jqgrid client-side

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

我们的问题是,对于某些用例,初始页面加载将设置postData过滤器,但网格不会对它们起作用。例如,我们可能有一个过滤器,用于“列A ='foo'和列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过滤器的情况下隐藏第一个网格视图(包含所有行)的任何替代方法也可以作为解决方法。

1 个答案:

答案 0 :(得分:2)

你描述的问题非常好。只有在jqGrid中进行更深层次的更改才能解决问题。

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

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

顺便说一句,使用免费jqGrid的最简单方法是从CDN加载它。请参阅here