在初始加载时获取带有 postData 过滤器的 jqGrid 以仅显示客户端过滤的行
Getting a jqGrid with postData filter on initial load to only display client-side filtered rows
我们有一个 jqGrid,它最初通过内置的 ajax 获取返回一个 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
个过滤器的情况,隐藏第一个网格视图(包含所有行)的任何替代方法也将作为解决方法提供帮助。
你把问题描述的很好。只有对 jqGrid 进行更深入的更改才能解决该问题。
我开发free jqGrid fork starting with the licence agreement of the main jqGrid repository are changed in version 4.7.1 and jqGrid are renamed in Guriddo jqGrid JS (see the post the prices of Guriddo jqGrid JS here)。从 2014 年底开始免费的 jqGrid 项目开始,我重写了 jqGrid 的许多旧部分。重写后一些功能实现起来相对容易。
如果您要替换当前的 jqGrid 以释放 jqGrid,那么您可以只使用新选项 forceClientSorting: true
,它与 loadonce: true
结合使用。强制应用客户端排序和过滤数据的选项before第一页将由 jqGrid 显示。以这种方式,您可以加载任何 JSON 数据,例如从一些 public 来源,您不能在服务器端更改任何内容,然后在客户端应用所需的过滤和排序。您应该删除 loadComplete
中的旧技巧,并且所有技巧都应该直接起作用。
顺便说一下,使用免费 jqGrid 的最简单方法是从 CDN 加载它。参见 the wiki article。
我们有一个 jqGrid,它最初通过内置的 ajax 获取返回一个 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
个过滤器的情况,隐藏第一个网格视图(包含所有行)的任何替代方法也将作为解决方法提供帮助。
你把问题描述的很好。只有对 jqGrid 进行更深入的更改才能解决该问题。
我开发free jqGrid fork starting with the licence agreement of the main jqGrid repository are changed in version 4.7.1 and jqGrid are renamed in Guriddo jqGrid JS (see the post the prices of Guriddo jqGrid JS here)。从 2014 年底开始免费的 jqGrid 项目开始,我重写了 jqGrid 的许多旧部分。重写后一些功能实现起来相对容易。
如果您要替换当前的 jqGrid 以释放 jqGrid,那么您可以只使用新选项 forceClientSorting: true
,它与 loadonce: true
结合使用。强制应用客户端排序和过滤数据的选项before第一页将由 jqGrid 显示。以这种方式,您可以加载任何 JSON 数据,例如从一些 public 来源,您不能在服务器端更改任何内容,然后在客户端应用所需的过滤和排序。您应该删除 loadComplete
中的旧技巧,并且所有技巧都应该直接起作用。
顺便说一下,使用免费 jqGrid 的最简单方法是从 CDN 加载它。参见 the wiki article。