2011-03-22 105 views
5

我正在使用最優秀的jqGrid插件,並通過搜索在本網站上找到了很多幫助,但我發現了一個我無法解決的問題,或找到解決方案。這將是我在這裏的第一篇文章。jqGrid高級搜索'beforeSearch'選項?

我正在使用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選項沒有正確的時間。有關如何繼續的建議?

馬克

+0

歡迎具有非常好的第一個問題。對於這個問題,我+1。在很短的時間內,我將嘗試描述解決問題的可能方法。稍後... – Oleg 2011-03-22 20:07:21

回答

4

你是對的,目前執行的jqGrid的先進的搜索沒有像beforeSearch任何事件。新版本的高級搜索是全新的,將有onSearch方法,你可以使用。像beforeSearch這樣的方法將在trigger("reloadGrid",[{page:1}])之前被解僱,但在postData之後將被填補。

filterToolbarbeforeSearch有一個更有趣的功能,這樣你就可以通過返回從beforeSearchtrue值停止搜索。所以beforeSearch可以發揮驗證作用。

在一個我old answer我描述了可用於任何種類的驗證postData變形例的通用的方法。在答案中,我展示瞭如何繼承jqGrid的reloadGrid事件處理程序,並在需要時停止重新加載網格。 The demo顯示了這一點。以同樣的方式,可以對數據進行任何其他修改。這很可惜,但the answer將非常糟糕的索引,並不會喜歡在stackoverflow上搜索最多。所以人們不知道它。

在您的情況下,您只需要即可在提交之前修改postdata,並且不需要停止網格重新加載。因此,您可以使用至少兩個標準jqGrid事件來解決問題:beforeRequestserializeGridData。在這兩個你都可以訪問search(作爲this.p.search)和postData(作爲this.p.postData)參數。 search參數的值將作爲_search發送到服務器,如果使用任何搜索/過濾方法,將被設置爲true。因此,在事件處理程序的內部,您可以修改this.p.postData

serializeGridData裏面,您甚至可以定義哪些數據將被準確發送到服務器,而無需修改數據。優點是,如果您下次打開提前搜索對話框,您將看到(並且可以根據需要修改)最後的搜索請求。

如果你需要有相同的實施beforeRequestserializeGridData您的網站的許多網格,您可以設置該功能的默認實現相對的$.jgrid.defaults:在計算器

$.extend($.jgrid.defaults, { 
     datatype: 'json', // overwrite default value of any jqGrid parameter 
     serializeGridData: function(postData) { 
      // your implementation 
     } 
}); 
+1

感謝您對此主題的回覆。我從演示中學到了很多東西,您可以爲您的答案創建,並且非常感謝。我確信我將能夠通過這個演示以及演示。如果一切都失敗了,最好知道即將推出的版本將增加一種方法來處理這個問題。 – driedger 2011-03-23 12:32:21

+0

有沒有一種方法可以只在搜索爲真的列上循環? – frabiacca 2013-03-21 17:14:53

+0

@frabiacca:對不起,但我不明白你的意思。你的意思是哪個週期? – Oleg 2013-03-21 17:18:08