2012-05-31 45 views
4

我有一个非常具体的问题:我有一个小型窗体,有四个选项。您可以将它们填充或不填充,当您单击“确定”时,我会根据这些选项加载包含数据的jqGrid。但是因为我不知道我的列是什么样的,所以我让我的servlet生成列模型和列名称;因此我必须发出一个AJAX请求来加载数据,然后将它作为“本地”数据填充到jqGrid中。我想使用分页。jqGrid:本地数据已经在表中载入JSON数据

因此,我的问题:如何通过本地数据建立一个jqGrid后,如何加载更多的数据?

下面的代码:

$.ajax({ 
    type : 'GET', 
    url : 'data.jsp', 
    data : reqData, 
    dataType : 'json', 
    error: function() { 
     $("#dialog-message").dialog("open"); 
     $("#ajax-loader").css("display", "none"); 
    }, 
    success : function(result) { 
     jQuery("#results").jqGrid({ 
      data : result.rows, 
      datatype : "local", 
      colNames : result.columnNames, 
      colModel : result.columnModel, 
      pager : $('#pager'), 
      rowNum : 1000, 
      scroll : true, 
      viewrecords : true, 
      sortname : 'TITEL', 
      width : window.innerWidth - 30, 
      height : window.innerHeight - 190, 
      altRows : true, 
      loadError: function() { 
       $("#dialog-message").dialog("open"); 
       $("#ajax-loader").css("display", "none"); 
      }, 
      loadComplete: function() { 
       $("#ajax-loader").css("display", "none"); 
      } 
     }).jqGrid("navGrid", "#pager", { 
      edit: false, 
      add: false, 
      del: false, 
      search: true, 
      refresh: false 
     }).jqGrid("gridResize"); 

    } 
}); 

/编辑:我试着做以下,但仍然没有解决不了的问题,网格不知道有多少总页数其实有(实际上,在那一点上,我甚至不知道),并且在加载之后,它认为它只获取本地数据。有没有onScroll事件或什么?我没有找到一个。

datatype : !json ? "local" : function(postdata) { 
       $.ajax({ 
        type: 'GET', 
        url: 'data.jsp', 
        data: $.merge(postdata, reqData), 
        dataType: 'json', 
        success: function(data, status, jqXHR) { 
         var mygrid = jQuery("#results")[0]; 
         var myjsongrid = eval("("+jqXHR.responseText+")"); 
         mygrid.addJSONData(myjsongrid); 
        } 
       }); 
      }, 
+0

您是否在一个Ajax请求中加载**所有**数据,或者您需要将数据追加到现有网格中?移除'scroll:true'选项并使用标​​准分页不是更好吗?如果添加'gridview:true',您将能够快速创建包含多行数据的网格。如果您将额外设置'rowNum'的值设置为更符合页面高度的值,那么您需要让用户能够使用寻呼机。 – Oleg

+0

我只加载第一个Ajax请求中的前1000行数据。总共有超过80 000行,并且当我一次加载所有的内存时,后台的servlet没有足够的内存(该表也恰好有大约40列)。即使我删除了'scroll:true',我仍然有这样的问题,即jqGrid不知道有多少页面,因此只能选择第一页。 – hugelgupf

+0

如果你可以有超过80000行,那么你可以在服务器端*使用标准的数据分页*而不用'scroll'。在这种情况下,您只需要加载第20-30行数据。您可以将'columnModel'加载到一个Ajax请求中,然后使用'datatype:'json''。在这种情况下,jqGrid将显示寻呼机中的页数和记录数,与您在服务器响应中放置的内容完全相同。 – Oleg

回答

1

你能不能做这样的事......让格,清除数据,定义URL摆脱(它可以根据用户选择哪一选项更改)的数据,然后改变DATAFORMAT以json而不是本地。

var grid = $('#TargetGridID'); 
    grid.clearGridData(); 
    grid.setGridParam({ url: '../controller/action?datatype=Option1' }); 
    grid.setGridParam({ datatype: 'json' }); 
    grid.trigger('reloadGrid'); 

我们使用这种方法,它的伟大工程......使用与能够分页存储过程和格子的速度极快!我知道一个20000行的网格大约需要700毫秒,页数为500行。

如果你使用SQL来处理数据,我可以上传一个关于如何在SQL存储过程中支持分页的示例,非常有用的东西。

+0

谢谢!我没有想到这一点。我实际上并不在我曾经这样做过的公司工作,所以我不需要代码来存储proc,谢谢:) – hugelgupf