【发布时间】: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