3

我正在开发一个 Django 项目,该项目使用 JQgrid 显示数据库中的数据。

我想要实现的是只连接搜索选项以执行远程搜索,其中服务器将返回结果集,并且所有其他 jqgrid 选项(如列排序、分页等)都将在客户端执行。

我知道这可以通过在事件之间设置和loadonce:true切换'datatype'参数来完成,具体取决于我是单击排序还是下一页、搜索等。'local''json'.click()

还有另一种方法可以做到这一点吗?如果没有,你们能否建议一种干净的方式来完成上述黑客攻击。

谢谢!

4

2 回答 2

3

我设法完成了这件事,我很高兴与大家分享这个。我已经在解释下方发布了我的整个 jqgrid 代码供您参考。

所以首先,我使用 JSON 作为结果,因此使用 jsonReader。

接下来,以下是特定于实现 {{search: remote},{sorting: local}, {pagination: local}} 行为的设置。

  1. 设置loadonce: false或点击“搜索”按钮不会点击服务器,而是始终进行本地搜索。

  2. 我想实现 jqGrid 的多重搜索功能,因此让微小的“放大镜”出现在您的寻呼机栏中。

    jQuery("#list2").jqGrid('navGrid','#pager2',{ del:false,add:false,edit:false},{},{},{},{multipleSearch:true});
    
  3. 现在我实现远程搜索功能的方法是在 onSearch 和 onClose 事件上将数据类型从本地切换到 json。即在触发搜索查询(即单击“查找”按钮)时,我将 loadonce 设置为 false 并将数据类型设置为 json。这确保了远程搜索。现在我们的网格填充了远程搜索数据,我们必须切换回 datatype:local,但是显式设置它 onClose 不起作用,所以我设置 loadonce: true 稍后设置 datatype: local 本身。另请注意,我有 closeAfterSearch: true、closeOnEscape: true,因此我确保在触发搜索查询后始终关闭 onClose 事件。

    jQuery("#list2").jqGrid('searchGrid', {multipleSearch: true, closeAfterSearch: true, closeOnEscape: true,
                                                        onSearch: function(){$("#list2").setGridParam({loadonce: false, datatype: 'json'});
                                                                                        $("#list2").trigger("reloadGrid");                                  
                                                                                        },                                                              onClose: function(){$("#list2").trigger("reloadGrid");                                                                                  
                                                                                    $("#list2").setGridParam({loadonce: true});
                                                                                    $(".ui-icon-refresh").trigger('click');                                                                                 
                                                                                    }
                                                    });
    

加载结果$(".ui-icon-refresh").trigger('click');后强制刷新。在某些情况下这是必要的(不知道为什么)。我自己偶然发现了这个修复程序,我不确定它为什么会起作用。如果您有想法,我很想知道它背后的原因。

  1. 最后,每次我的网格加载时,默认情况下都会弹出搜索框。所以我通过简单地让 jquery 单击模态框的“x”按钮来强制关闭它。哈克但有效!:P

    $(".ui-icon-closethick").trigger('click');
    

<<<整个jqGrid代码>>>

请原谅我在代码中的'xyz'。我在那里有一些 Django 代码,所以我只是用 xyz 替换它以避免任何混淆。

jQuery(document).ready(function(){ 

  $("#list2").jqGrid({

    url:'xyz',
    datatype: 'json',
    loadonce: false,
    mtype: 'GET',
    colNames:xyz
    colModel :xyz,
    jsonReader : {
                repeatitems: false,
                root: "rows",
                page: "page",
                total: "total",
                records: "records"
        },
    height: '100%',
    width: '100%',
    pager: '#pager2',
    rowNum:15,
    rowList:[10,15,30],
    viewrecords: true,
    caption: '&nbsp',
     autowidth: false,
     shrinkToFit: true,
     ignoreCase:true,
     gridview: true

   });
  jQuery("#list2").jqGrid('navGrid','#pager2',{ del:false,add:false,edit:false},{},{},{}, {multipleSearch:true});
  jQuery("#list2").jqGrid('navButtonAdd', '#pager2',
                         {
                             caption: "", buttonicon: "ui-icon-calculator", title: "choose columns",
                             onClickButton: function() {
                                 jQuery("#list2").jqGrid('columnChooser');
                            }
                         });
  jQuery("#list2").jqGrid('searchGrid', {multipleSearch: true, closeAfterSearch: true, closeOnEscape: true,
                                                        onSearch: function(){$("#list2").setGridParam({loadonce: false, datatype: 'json'});
                                                                                        $("#list2").trigger("reloadGrid");                                  
                                                                                        }, 

                                                        onClose: function(){$("#list2").trigger("reloadGrid");                                                                                  
                                                                                    $("#list2").setGridParam({loadonce: true});
                                                                                    $(".ui-icon-refresh").trigger('click');                                                                                 
                                                                                    }
                                                    });


  $(window).bind('resize', function () {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(resizeGrids, 60);
    divwidth = $(".content-box-header").width() - 40;
    //alert(divwidth);
   $("#list2").setGridWidth(divwidth,true);

    }); 

    $(window).resize();
    $(".ui-icon-closethick").trigger('click');

});
于 2012-08-24T19:32:52.647 回答
1

如果您查看下面的代码,我正在工具栏上的两个日期之间进行搜索,“e”是我正在使用的控件的 ID。现在关键因素是名为“search”的属性,如果您将其设置为“true”,它将执行客户端搜索,false 将对您为搜索调用的任何 ajax 方法执行远程搜索。

        var gridFilter;
        var fieldId = e.replace('#', '');
        var fieldForFilter = fieldId.replace('gs_', '');//All toolbar filters Id's are the same as the column Id but prefixed with "gs_"
        var splitteddates = $("#" +fieldId).val().split('-');
        var grid = $("#GridJq1");
        gridFilter = { groupOp: "AND", rules: [] };
        gridFilter.rules.push({ field: "" + fieldForFilter + "", op: "gt", data: "" + $.trim(splitteddates[0]) + "" });
        gridFilter.rules.push({ field: "" + fieldForFilter + "", op: "lt", data: "" + $.trim(splitteddates[1]) + "" });
        grid[0].p.search = true;//specifies wether to do a client search or a server search which will be done manually. true=client search
        $.extend(grid[0].p.postData, { filters: JSON.stringify(gridFilter) });//combine post data and newly added filter data
        grid.trigger("reloadGrid", [{ page: 1, current: true}]);//reset to page and keep current selection if any

如果我没记错的话,上面用于构建搜索的部分代码来自著名的 JQGrid Oleg 的答案,如果这是他的代码的一部分,那么对他表示敬意。

于 2012-08-14T12:53:50.097 回答