【问题标题】:jqgrid filter strange behaviourjqgrid过滤奇怪的行为
【发布时间】:2012-07-28 07:54:16
【问题描述】:

查看Oleg solution进行jqgrid过滤,我写了一个代码来过滤我的jqgrid。不同的是有3个不同的研究领域,但只有一个按钮来执行全局搜索。它工作得很好,但即使第一次搜索正确执行,第二次搜索执行 2 次,第三次搜索 4 次,第四次搜索 8 次等等,如果我进行大量搜索会导致几个问题。 代码如下:

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;
                //....
                }

【问题讨论】:

    标签: jquery jqgrid filtering


    【解决方案1】:

    我想您的代码中的问题是您将$("#executeSearch").click 放在executeSearchInSoftgrid 函数中,您可能会多次调用该函数。代码

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

    只不过是注册事件处理程序(函数function() {...}),如果用户单击具有id="executeSearch" 的元素,它将自动调用。您可以向click 事件注册多个 事件句柄。在这种情况下,所有回调都将按照注册的顺序调用。

    所以你应该只注册一次回调函数。如果您需要独立于用户交互的事件处理程序调用,您可以使用$("#executeSearch").triggerHandler('click')(参见here)或仅使用$("#executeSearch").click();

    【讨论】:

    • 我检查了我的 js 文件,我在 loadcomplete 中只调用了一次 executeSearchInSoftgrid()
    • @Franky:loadcomplete 将在每次网格刷新时调用。因此,您在每个网格重新加载/分页/排序/过滤时绑定越来越多的事件。创建网格后,您应该将代码移出loadcomplete
    • 在gridcomplete、loadcomplete、readyfunction中试过了..行为总是一样的,警报弹出1、2、4、8、16..次
    • @Franky:您应该将代码 放在任何回调之外。您应该在创建网格之后放置代码。例如:$("#grid").jqGrid({/*jqGrid options and callbacks*/}); $("#executeSearch").click(function() {/*the code of your eventhandler*/});
    • @Franky:抱歉,您应该发布您使用的代码或将 URL 发布到演示。我想您不会从loadcompletegridcomplete 等中删除executeSearchInSoftgrid 的一些旧调用。此外,整个代码必须在 jQuery.ready 内。
    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多