2012-07-30 189 views
0

看着Oleg solution jqgrid過濾,我寫了一個代碼來過濾我的jqgrid。它有不同的有3個不同的研究領域,但只有一個按鈕來執行全局搜索。它工作的很好,但即使第一次搜索正確執行,第二次搜索執行2次,第三次搜索4次,第四次8次等等,如果我進行大量搜索,會導致幾個問題。 下面的代碼:jqgrid過濾器奇怪的行爲

var grid= $("#mygrid"); 

function executeSearchInSoftgrid() {  
$("#executeSearch").click(function() { 
    f = {groupOp:"AND",rules:[]}; 
    var searchFiler = $("#filterField1").val(), f; 
    var searchFiler2 = $("#filterField2").val(), f; 
    var searchFiler3 = $("#filterField3").val(), f; 
    if (searchFiler.length === 0) { 
     grid[0].p.search = false; 
     $.extend(grid[0].p.postData,{filters:""}); 
    } 
    if (searchFiler2.length === 0) { 
     grid[0].p.search = false; 
     $.extend(grid[0].p.postData,{filters:""}); 
    } 
    if (searchFiler3.length === 0) { 
     grid[0].p.search = false; 
     $.extend(grid[0].p.postData,{filters:""}); 
    } 

    f.rules.push({field:"field1",op:"cn",data:searchFiler}); 
    f.rules.push({field:"field2",op:"cn",data:searchFiler2}); 
    f.rules.push({field:"field3",op:"cn",data:searchFiler3}); 
    grid[0].p.search = true; 
    $.extend(grid[0].p.postData,{filters:JSON.stringify(f)}); 
    grid.trigger("reloadGrid",[{page:1,current:true}]); 
    alert("searching"); 
}); 

}

無論我調用函數(loadcomplete,gridcomplete,readyfunction)的行爲是一樣的。有任何想法嗎??? 感謝

編輯

此處,我調用該函數的地方,最後和它的工作原理:

var initialize = true; 
$("#mygrid") 
     .jqGrid({ 
      gridComplete:function() { 
       if(initialize == true) { 
       executeSearchInSoftgrid(); 
       initialize = false; 
       //.... 
       } 

回答

1

我想,在你的代碼的問題是,你放在$("#executeSearch").clickexecuteSearchInSoftgrid內你可能稱之爲一次的函數。代碼

$("#executeSearch").click(function() {...}); 

無非是爲作爲事件處理程序(功能function() {...})如果具有id="executeSearch"所述元件上的用戶點擊,這將被自動調用的註冊。您可以註冊多個事件處理到click事件。在這種情況下,所有的回調將按照註冊順序進行調用。

所以你應該只註冊一次回調函數。如果您需要獨立於用戶交互的事件處理程序,則可以使用$("#executeSearch").triggerHandler('click')(請參閱here)或僅使用$("#executeSearch").click();執行此操作。

+0

我檢查了我的js文件,我在loadcomplete中只調用了一次executeSearchInSoftgrid() – Franky 2012-07-30 16:39:54

+0

@Franky:'loadcomplete'將在每個網格刷新**上調用**。因此,您可以在每個網格重新加載/分頁/排序/過濾時綁定越來越多的事件。創建網格後,您應該將代碼移出'loadcomplete'。 – Oleg 2012-07-30 16:44:53

+0

嘗試在gridcomplete,loadcomplete,readyfunction .. 的行爲總是相同的,警報彈出1,2,4,8,16 ..次 – Franky 2012-07-30 16:56:38