jqGrid高级搜索'beforeSearch'选项?

时间:2011-03-22 18:53:47

标签: jquery jqgrid

我正在使用最优秀的jqGrid插件,并通过搜索在此网站上找到了很多帮助,但我发现了一个我无法解决的问题,或者找到了解决方法。这将是我在这里的第一篇文章。

我正在使用filterToolbar来搜索我的网格。由于我需要与之交互的后端的性质,我无法使用jqGrid提供的过滤器,而是需要在提交之前拦截搜索并修改postdata。我使用filterToolbar选项“beforeSearch”执行此操作:

$("#SC_grid").jqGrid('filterToolbar', {stringResult: true, searchOnEnter: true, defaultSearch : "cn", beforeSearch: function() {
            var postData = $("#SC_grid").jqGrid('getGridParam','postData');
            var newPostData = '1=1';
            var searchData = jQuery.parseJSON(postData.filters);
            for (var iRule=0; iRule<searchData.rules.length; iRule++) {
                newPostData = newPostData + " AND " + searchData.rules[iRule].field + " LIKE '%" + searchData.rules[iRule].data + "%' ";
            }
            $("#SC_grid").jqGrid('setGridParam',{postData: { filter: newPostData, filters: ''} } );
            return false;
}});

这对我来说非常适合在提交之前构建我的部分选择。 我也想以相同的方式使用高级搜索,但无法弄清楚如何在提交之前拦截POST。似乎没有可用的beforeSearch()选项,并且afterShowSearch或onClose选项没有正确的时间。关于如何进行的任何建议?

标记

1 个答案:

答案 0 :(得分:4)

你说得对,jqGrid高级搜索的当前实现没有beforeSearch之类的任何事件。全新编写的高级搜索的新版本将具有onSearch方法,您可以使用它。 beforeSearch之类的方法将在trigger("reloadGrid",[{page:1}])之前触发,但在postData之后将被填充。

beforeSearch的{​​{1}}还有一个有趣的功能,因此您可以通过返回filterToolbar中的true值来停止搜索。因此beforeSearch可以发挥验证作用。

在我的old answer中,我描述了一种通用方法,可用于任何类型的验证beforeSearch修改。在答案中,我展示了如何将jqGrid的postData事件处理程序子类化,并在需要时停止重新加载网格。 The demo显示了这一点。以同样的方式,可以对数据进行任何其他修改。遗憾的是,the answer索引非常糟糕,并且不会喜欢堆栈溢出上最多的搜索。所以一个人不知道。

在这种情况下,您只需要在提交之前修改postdata ,并且不需要停止网格重新加载。因此,您可以使用至少两个标准jqGrid事件来解决问题:beforeRequestserializeGridData。您可以访问reloadGridsearch}和this.p.searchpostData)参数。 this.p.postData参数的值将作为search发送到服务器,如果使用任何搜索/过滤方法,则将设置为_search。因此,在事件处理程序中,您可以修改true

serializeGridData内部,您甚至可以定义哪些数据准确地发送到服务器而无需修改数据。优点是,如果您下次打开预先搜索对话框,您将看到(并且可以根据需要修改)最后一次搜索请求。

如果您需要在网站的多个网格上实现beforeRequestserializeGridData的相同实现,则可以设置与this.p.postData相关的函数的默认实现:

$.jgrid.defaults