寻呼机在带有 JSON 的 jqGrid 中没有按预期工作

Posted

技术标签:

【中文标题】寻呼机在带有 JSON 的 jqGrid 中没有按预期工作【英文标题】:The pager is not working as expected in jqGrid with a JSON 【发布时间】:2012-01-12 16:20:54 【问题描述】:

我有一个关于 jqGrid 和 Json 的问题。

这是我的jsp文件的代码和jquery的代码:

    <body >

    <script type="text/javascript">
        jq(function() 
            jq("#grid").jqGrid(
                url:'/test-security-client/crud',
                datatype: 'json',
                mtype: 'GET',
                colNames:['Id', 'Log Message'],
                colModel:[
                    name:'id',index:'id', width:55,editoptions:readonly:true,size:10,hidden:true,
                    name:'logMsg',index:'logMsg', width:300,editable:true, editrules:required:true, editoptions:size:10
                ],
                rowNum:20,
                rowList:[20,40,60],
                height: 450,
                autowidth: true,
                rownumbers: true,
                pager: '#pager',
                sortname: 'id',
                viewrecords: true,
                sortorder: "asc",
                caption:"Error Logs",
                emptyrecords: "Empty records",
                loadonce: false,
                loadComplete: function() 
                ,
                jsonReader : 
                    root: "rows",
                    page: "page",
                    total: "total",
                    records: "records",
                    repeatitems: false,
                    cell: "cell",
                    id: "id"
                
            );

            jq("#grid").jqGrid('navGrid','#pager',
                    edit:false,add:false,del:false,search:false,
                     ,
                     ,
                     , 
                     
                        sopt:['eq', 'ne', 'lt', 'gt', 'cn', 'bw', 'ew'],
                        closeOnEscape: true, 
                            multipleSearch: true, 
                            closeAfterSearch: true 
            );

            jq("#grid").navButtonAdd('#pager',
                   caption:"Delete", 
                    buttonicon:"ui-icon-trash", 
                    onClickButton: deleteRow,
                    position: "last", 
                    title:"", 
                    cursor: "pointer"
                 
            );

            jq("#btnFilter").click(function()
                jq("#grid").jqGrid('searchGrid',
                        multipleSearch: false, 
                            sopt:['eq']
                );
            );

        );
    </script>
   ...

这是我要发送的 JSON:

"total":"2","page":"1","records":"28","rows":["id":1,"logMsg":"ID of log:1-Requesting authentication. (SMA/SmaAdmin/password)","id":2,"logMsg":"ID of log:2-Authentication received.","id":3,"logMsg":"ID of log:3-Test","id":4,"logMsg":"ID of log:4-Test 2","id":5,"logMsg":"ID of log:5-Test 3","id":6,"logMsg":"ID of log:6-Test 4","id":7,"logMsg":"ID of log:7-Test 5","id":8,"logMsg":"ID of log:8-Test 6","id":9,"logMsg":"ID of log:9-Test 7","id":10,"logMsg":"ID of log:10-Test 8","id":11,"logMsg":"ID of log:11-Test 9","id":12,"logMsg":"ID of log:12-Test 10","id":13,"logMsg":"ID of log:13-Test 11","id":14,"logMsg":"ID of log:14-Test 12","id":15,"logMsg":"ID of log:15-Test 13","id":16,"logMsg":"ID of log:16-Test 14","id":17,"logMsg":"ID of log:17-Test 15","id":18,"logMsg":"ID of log:18-Test 16","id":19,"logMsg":"ID of log:19-Test 17","id":20,"logMsg":"ID of log:20-Test 18","id":21,"logMsg":"ID of log:21-Test 19","id":22,"logMsg":"ID of log:22-Test 20","id":23,"logMsg":"ID of log:23-Test 21","id":24,"logMsg":"ID of log:24-Test 22","id":25,"logMsg":"ID of log:25-Test 23","id":26,"logMsg":"ID of log:26-Test 24","id":27,"logMsg":"ID of log:27-Test 25","id":28,"logMsg":"ID of log:28-Test 26"]

这是我的问题:此代码运行正常,jqgrid 显示良好,所有信息都正常运行。但是寻呼机不能正常工作。因为,我不能在页面之间移动。 (我有 2 页,我在第 1 页开始 jqGrid .. 但我不能转到第 2 页)。

如果我将属性 loadonce 更改为 true.. 则正在工作。但是我不想使用这个属性,而且所有的记录都在错误的位置。

据我了解 JSON 是正确的,代码是正确的,我不知道我在做什么错。 (我是 jqGrid 和 JQuery 的新手)。我猜我的寻呼机有一种问题。

知道我做错了什么吗?我必须发送一个包含每个页面信息的 Json 吗?

【问题讨论】:

【参考方案1】:

你的 JSON 作为 JSON 是正确的,但它与 jqGrid 请求的数据不对应。让我们解释一下。

你有rowNum: 20sortname: 'id'sortorder: "asc"。在开头(在第一次填充网格时)jqGrid 通过 URL '/test-security-client/crud' 向您的服务器发送在 URL 末尾具有 page=1&amp;rows=20&amp;sidx=id&amp;sord=asc 的请求:/test-security-client/crud?page=1&amp;rows=20&amp;sidx=id&amp;sord=asc。这意味着在来自服务器的响应中,您应该只包含按id 排序的结果集中的前20 个项目。所以你必须按id对结果集进行排序(见sidx=idsord=asc-ORDER BY id)然后得到第一页(page=1),其中页面大小为20(rows=20- SELECT (TOP 20))。

您当前来自服务器的响应包括所有 28 个结果集。对于第一页,这并不重要,但我认为第二页的请求响应包含相同的 28 项,而不仅仅是最后 8 项(排序对于获得正确的 8 项非常重要)。

如果您要修复服务器代码中的问题,网格将在页面更改时显示正确的数据。

【讨论】:

我猜你是对的。谢谢!为解释。现在我明白我的错误了。我将实施该解决方案,然后我将发布一个我所做的示例。但是,是的...... JSON 是正确的,但 JSON 中的数据并不准确。我应该只发送带有该页面记录的每一页。再次感谢。 嗯,我已经解决了这个问题。我发现了一个很好的教程,它解释了解决这个问题的好方法。所以我不打算发布我的代码,因为我遵循了另一个.. 我的修改:) 本教程的链接是:javacodegeeks.com/2011/07/…

以上是关于寻呼机在带有 JSON 的 jqGrid 中没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

jQgrid错误的寻呼机结构

jqgrid inlineNav cloneToTop?

Jqgrid寻呼机(顶部或底部)太多自定义按钮然后溢出图片和文本,如何解决?

rowList 的文本框而不是 jqGrid 寻呼机中的选择

重新启用 JQGrid 上的寻呼机按钮

jqGrid GridUnload / GridDestroy