2012-07-30 76 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