2011-11-09 69 views
1

我有一个jqGrid,如果点击标题进行排序,我的所有网格数据都会消失,我不知道为什么会发生这种情况。这是一个sample page我制作了repro的问题。jqGrid客户端数据在点击排序列时消失

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Disappearing Sort Repro</title> 
    <link type="text/css" rel="Stylesheet" href="js/jQuery/plugins/jqGrid4/ui.jqgrid.css" /> 

</head> 
<body> 
    <table id="ooTruckGrid"> 
    </table> 
    <div id="ooTruckPager"> 
    </div> 
    <script language="javascript" type="text/javascript" src="js/jquery/jquery-1.6.2.js"></script> 
    <script language="javascript" type="text/javascript" src="js/jquery/jquery-ui.js"></script> 
    <script language="javascript" type="text/javascript" src="js/jquery/plugins/jqGrid4/grid.locale-en.js"></script> 
    <script language="javascript" type="text/javascript" src="js/jQuery/plugins/jqGrid4/jquery.jqGrid.js"></script> 
    <script language="javascript" type="text/javascript"> 
     _truckList = []; 

     $(document).ready(function() { 
      $("#ooTruckGrid").jqGrid({ 
       datatype: "clientSide", 
       colNames: ['id', 'VIN', 'Plate', 'Make', 'Model', 'Year', 'RFID #', 'Description'], 
       colModel: [ 
        { name: 'id', index: 'id', hidden: true, sorttype: "int" }, 
        { name: 'vin', index: 'vin', width: 120, sorttype: "text" }, 
        { name: 'plate', index: 'plate', width: 75, sorttype: "text" }, 
        { name: 'make', index: 'make', width: 80, sorttype: "text" }, 
        { name: 'model', index: 'model', width: 80, sorttype: "text" }, 
        { name: 'year', index: 'year', width: 40, sorttype: "int" }, 
        { name: 'rfidNo', index: 'rfidNo', width: 50, sorttype: "text" }, 
        { name: 'description', index: 'description', width: 100, sortable: false } 
       ], 
       datatype: 'local', 
       hidegrid: false, 
       jsonReader: { 
        repeatitems: false 
       }, 
       loadonce: true, 
       multiselect: true, 
       pgbuttons: false, 
       pginput: false, 
       rowNum: '', 
       pager: '#ooTruckPager', 
       sortable: false, 
       viewrecords: true 
      }); 

      // Add truck   
      addTruckData(-1, 0, "11111111111111111", "Make 1", "Model 1-1", "2009", "US", "WA", "1D1D1D", "", "Test truck 1"); 
      addTruckData(-1, 0, "22222222222222222", "Make 2", "Model 2-1", "2010", "US", "WA", "2A2A2A", "11111", "Test truck 2"); 
      addTruckData(-1, 0, "33333333333333333", "Make 2", "Model 2-2", "2011", "US", "WA", "3B3B3B", "", "Test truck 3"); 
      addTruckData(-1, 0, "44444444444444444", "Make 1", "Model 1-2", "2006", "US", "WA", "4C4C4C", "22222", "Test truck 4"); 
      addTruckData(-1, 0, "55555555555555555", "Make 3", "Model 3-1", "2003", "US", "WA", "5E5E5E", "", "Test truck 5"); 
     }); 

     function addTruckData(rowId, id, vin, make, model, year, country, state, 
      plate, rfid, description) { 

      var rowId = -1; 
      var method = ''; 

      var truck = new truckData(-1, // rowId 
      id, vin, make, model, year, country, 
      state, plate, rfid, description); 

      if (_truckList.length > 0) { 
       for (var xx = 0; xx < _truckList.length; xx++) { 
        if (_truckList[xx].vin == vin) { 
         // The vin is already in the list, update it. 
         rowId = _truckList[xx].rowId; 
         break; 
        } 
       } 
      } 

      if (rowId == -1 && _truckList.length == 0) { 
       _truckList = [truck]; 
       rowId = 0; 
       method = 'addRowData'; 
      } 
      else if (rowId == -1) { 
       rowId = _truckList.length; 
       _truckList.push(truck); 
       method = 'addRowData'; 
      } 
      else { 
       _truckList[rowId] = truck; 
       method = 'setRowData'; 
      } 

      truck.rowId = rowId; 
      result = $('#ooTruckGrid').jqGrid(method, rowId, truck.toJqGridData()); 
     } 

     function truckData(rowId, truckId, vin, make, model, year, country, state, plateNum, description, rfid, truckType) { 
      return { 
       rowId: rowId, 
       id: truckId, 
       vin: $.trim(vin), 
       make: make, 
       model: model, 
       year: year, 
       plateCountry: country, 
       plateState: state, 
       plateNumber: $.trim(plateNum), 
       description: $.trim(description), 
       rfid: $.trim(rfid), 
       truckType: truckType, 
       toJqGridData: function() { 
        return { "id": this.id, 'action': '', 'vin': this.vin, 
         'plate': this.plateCountry + '-' + this.plateState + '-' + 
         this.plateNumber, 'make': this.make, 'model': this.model, 
         'year': this.year, 'rfidNo': this.rfid, 
         'description': this.description 
        }; 
       } 
      }; 
     } 
    </script> 
</body> 
</html> 

如果转到该链接,然后单击其中一个标题,则所有数据消失而不是排序网格。

回答

5

在列分类中产生数据消失的错误是选项rowNum: ''。如果您不需要分页数据,您应该为rowNum设置一些足够大的值,如rowNum: 10000。这种改变将解决你的主要问题。

你的代码有许多其他的小错误或烂笔头部分,我想提一提:

  • 您测试页不包括jquery-ui.css这是非常重要。另一方面,你包括jquery-ui.js这是jqGrid不需要的。只有在使用一些jQuery UI功能时才应该包含它。
  • addTruckData函数包含rowId参数,但您可以使用相同名称定义局部变量并在代码中稍后分配值var rowId = -1。当然这是错误的。
  • 您应该在页眉中包含<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • 您应该删除已弃用language="javascript"属性<script>
  • 如果您想要正确的XHTML 1.0 Transitional页面,您应该在<table>元素内包含一个空单元格<tr><td/></tr>。在jqGrid初始化期间,空单元格将被删除。
  • 您在JavaScript代码中使用<&字符。因此,为了获得正确的XHTML代码,您应该修改代码,或者在脚本的开始处包含行//<![CDATA[,并在行尾加上//]]>行。
  • 你应该遵循JavaScript标准的类,并删除功能truckDataTruckData
  • 尽可能使用较少的全局变量和全局函数。例如功能TruckDataaddTruckData像变量_truckList(更好truckList)可以的$(document).ready(function() {/*here*/});
  • 内移动使用存在之前,您应该定义变量。例如,如果没有定义,则使用result。在这种情况下,result将被解释为全局变量,并将作为属性添加到windows对象。
  • 在同一个网格中使用datatype: "clientSide"datatype: 'local'。您应该删除datatype: "clientSide"
  • 您应该删除loadonce: true,因为在datatype: 'local'的情况下它没有任何意义并且将被忽略。
  • 您应该删除colModel的属性,这些属性默认为sorttype: "text",并删除jqGrid options,这些默认值也是sortable: false。另一方面,您可以考虑包含height: 'auto'参数。
  • 我建议您使用JSLint来提高JavaScript代码的质量,并使用W3 validator来验证HTML标记。

我修改了您的页面一次,以显示如何完成上述更改。演示here没有JSLint或W3验证器错误。

-1

添加以下行中的jqGrid创建范围:

rowNum: 9007199254740992

这将最大容量的行的jqGrid