2014-09-12 4 views
1

В пользовательской кнопке на моем пейджере я вызываю grid.jqGrid("getGridParam", "data"), "data"), чтобы получить все данные в сетке, но он возвращает пустой массив. Когда я вызываю grid.jqGrid("getGridParam", "data") в функции loadComplete, он все равно возвращает пустой массив. Однако, если я звоню grid.jqGrid('getRowData'), он дает мне данные, которые я ищу. См. Мой код ниже.Данные JQGrid getGridParam возвращают пустой массив

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
     pageEncoding="ISO-8859-1" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <link rel="stylesheet" type="text/css" media="screen" href="${pageContext.request.contextPath}/css/jquery-ui.min.css"/> 
    <link rel="stylesheet" type="text/css" media="screen" href="${pageContext.request.contextPath}/css/ui.jqgrid.css"/> 
    <!-- Overide css styling to ensure that calendar image is inline with text box --> 
    <style type="text/css">.ui-jqgrid .ui-search-table .ui-search-input > input, 
          .ui-jqgrid .ui-search-table .ui-search-input > select, 
          .ui-jqgrid .ui-search-table .ui-search-input > img {vertical-align: middle; display: inline-block;} 
    </style> 
    <script src="${pageContext.request.contextPath}/js/jquery-1.11.0.min.js" type="text/javascript"></script> 
    <script src="${pageContext.request.contextPath}/js/jquery-ui.min.js" type="text/javascript"></script> 
    <script src="${pageContext.request.contextPath}/js/grid.locale-en.js" type="text/javascript"></script> 
    <script src="${pageContext.request.contextPath}/js/jquery.jqGrid.min.js" type="text/javascript"></script> 
    <title>Trucks Overview</title> 

    <script type="text/javascript"> 
    jQuery().ready(function() { 
     var grid = jQuery("#truck_grid"); 
     var orderGridDialog = $('#truck_grid_dialog'); 
     var gridData; 

     getUniqueNames = function(columnName) { 
      var texts = grid.jqGrid('getCol', columnName, false); 
      var uniqueTexts = [], textsLength = texts.length, text, i, textsMap = {}; 
      for (i=0;i<textsLength;i++) { 
       text = texts[i]; 
       if (text != undefined && textsMap[text] === undefined) { 
        // to test whether the texts is unique we place it in the map. 
        textsMap[text] = true; 
        uniqueTexts.push(text); 
       } 
      } 
      return uniqueTexts; 
     }; 
     buildSearchSelect = function(uniqueNames) { 
      var values=":All"; 
      $.each (uniqueNames, function() { 
       values += ";" + this + ":" + this; 
      }); 
      return values; 
     }; 
     setSearchSelect = function(columnName) { 
      grid.jqGrid('setColProp', columnName, 
         { stype: 'select', 
          searchoptions: { 
           value:buildSearchSelect(getUniqueNames(columnName)), 
           sopt:['eq'] 
          } 
         } 
      ); 
     }; 

     var initDateWithButton = function (elem) { 
      if (/^\d+%$/.test(elem.style.width)) { 
       // remove % from the searching toolbar 
       elem.style.width = ''; 
      } 
      // to be able to use 'showOn' option of datepicker in advance searching dialog 
      // or in the editing we have to use setTimeout 
      setTimeout(function() { 
       $(elem).datepicker({ 
        dateFormat: 'mm/dd/yy', 
        showOn: 'button', 
        changeYear: true, 
        changeMonth: true,  
        buttonImageOnly: true, 
        buttonImage: "images/calendar.gif", 
        buttonText: "Select date", 
        showButtonPanel: true, 
        onSelect: function (dateText, inst) { 
         inst.input.focus(); 
         if (typeof (inst.id) === "string" && inst.id.substr(0, 3) === "gs_") { 
          $(inst.id).val(dateText); 
          grid[0].triggerToolbar(); 
         } 
         else { 
          // to refresh the filter 
          $(inst).trigger("change"); 
         } 
        } 
       }); 
      }, 100); 
     }; 

     grid.jqGrid({ 
      url: '${pageContext.request.contextPath}/getTrucksJSONAction', 
      datatype: "json", 
      mtype: 'GET', 
      colNames: ['Truck ID', 'Status', 'Carrier Code', 'Date Created', 'Date Closed', 'T1 Status', 'Truck Arrived'], 
      colModel: [ 
       {name: 'truckId', key:true, index: 'truckId', align: 'center', width: 100}, 
       {name: 'status', index: 'status', align: 'center', width: 100}, 
       {name: 'carrierName', index: 'carrierName', align: 'center', width: 100}, 
       {name: 'createdDate', index: 'createdDate', align: 'center', width: 100}, 
       {name: 'closedDate', index: 'closedDate', align: 'center', width: 100}, 
       {name: 't1Status', sortable: false, align: 'center', width: 100, fixed: true, 
        formatter: function (celvalue) { 
         return celvalue ? 
          "<img src='http://www.clker.com/cliparts/q/j/I/0/8/d/green-circle-icon-md.png' alt='green light' style='width:15px;height:15px'/>" : 
          "<img src='http://www.iconsdb.com/icons/preview/red/circle-xxl.png' alt='red light' style='width:10px;height:10px'/>"; 
        }} , 
       {name: 'truckArrived', sortable: false, align: 'center', width: 100, fixed: true, 
         formatter: function (celvalue) { 
          return celvalue ? 
           "<img src='http://www.clker.com/cliparts/q/j/I/0/8/d/green-circle-icon-md.png' alt='green light' style='width:15px;height:15px'/>" : 
           "<img src='http://www.iconsdb.com/icons/preview/red/circle-xxl.png' alt='red light' style='width:10px;height:10px'/>"; 
         }}  
      ], 
      rowNum: 10, 
      height: 300, 
      autoheight: true, 
      autowidth: true, 
      rowList: [10, 20, 30], 
      pager: jQuery('#truck_grid_pager'), 
      sortname: 'truckId', 
      sortorder: "desc", 
      jsonReader: { 
       root: "records", 
       page: "page", 
       total: "total", 
       records: "rows", 
       repeatitems: false 
      }, 
      viewrecords: true, 
      altRows: false, 
      gridview: true, 
      hidegrid: false, 
      multiselect:true, 
      recordtext: '', 
      emptyrecords: 'No Trucks', 
      forceFit: true, 
      caption: "Trucks Overview", 
      loadComplete: function() { 
       // Reload the grid after changing paginattion 
       var allRecords = grid.getGridParam('lastpage') * grid.getGridParam('records'); 
       grid.jqGrid('setGridParam', { 
        recordtext: allRecords + ' Trucks(s) Found. Displaying {0} to {1}'}); 
       $(this).trigger("reloadGrid"); 
       async: false, 
       setSearchSelect('status'); 
       setSearchSelect('carrierName'); 
       grid.jqGrid('setColProp', 'truckId', { 
        searchoptions : { 
         sopt : [ 'bw' ], 
         dataInit : function(elem) { 
          $(elem).autocomplete({ 
           source : getUniqueNames('truckId'), 
           delay : 0, 
           minLength : 0 
          }); 
         } 
        } 
       }); 
       grid.jqGrid('setColProp', 'createdDate', { 
        sorttype: 'date', editable: true, 
         editoptions: { dataInit: initDateWithButton, size: 8 }, 
         searchoptions: { 
          sopt: ['eq', 'ne', 'lt', 'le', 'gt', 'ge'], 
          dataInit: initDateWithButton 
         } 
       }); 
       gridData = $(this).jqGrid("getGridParam", "data"); 
       grid.jqGrid('filterToolbar', {autoSearch: true}); 
      }, 
     }).navGrid('#truck_grid_pager', {edit: false, add: false, del: false, search: false, refresh: true}) 
     .navButtonAdd('#truck_grid_pager', {caption:"Truck Arrived", buttonicon:"ui-icon-flag", position:"first", title:"Truck Arrived", 
      onClickButton: function(){ 
       var i; 
       var data = grid.jqGrid("getGridParam", "data"); 
       var selRowIds = grid.jqGrid('getGridParam', 'selarrrow'); 
       for (i = 0; i < data.length; i++) { 
        if (selRowIds.indexOf(data[i].truckId) > -1) { 
         data[i].truckArrived = true; 
        } 
       } 
       grid.trigger("reloadGrid"); 
      } 
     }) 
     .navButtonAdd('#truck_grid_pager', {caption:"Ship Confirm", buttonicon:"ui-icon-circle-check", position:"first", title:"Ship Confirm", 
      onClickButton: function(){ 
      alert("Ship has been confirmed");} 
     }); 

     orderGridDialog.dialog({ 
      autoOpen: false, 
      width: 1000, 
      height: 400, 
      draggable: false, 
      show: { 
       effect: "blind", 
       duration: 500 
      }, 
      hide: { 
       effect: "blind", 
       duration: 250 
      }, 
      close: function(event, ui){ 
       orderGridDialog.text('Loading Grid...'); 
      } 
     }); 
    }); 

</script> 
</head> 
<body> 
<table id="truck_grid"></table> 
<div id="truck_grid_pager"></div> 
<div id="truck_grid_dialog" title="Orders Overview">Loading...</div> 
</body> 
</html> 


The problem happens in the last section of the code, namely: 

     .navButtonAdd('#truck_grid_pager', {caption:"Truck Arrived", buttonicon:"ui-icon-flag", position:"first", title:"Truck Arrived", 
      onClickButton: function(){ 
       var i; 
       var data = grid.jqGrid("getGridParam", "data"); 
       var selRowIds = grid.jqGrid('getGridParam', 'selarrrow'); 
       for (i = 0; i < data.length; i++) { 
        if (selRowIds.indexOf(data[i].truckId) > -1) { 
         data[i].truckArrived = true; 
        } 
       } 
       grid.trigger("reloadGrid"); 
      } 
     }) 

Вторая проблема у меня есть, когда grid.trigger("reloadGrid") называется, значок truckArrived не изменяется от красного до зеленого, как ожидалось.

ответ

2

Внутренний параметр data будет использоваться только в том случае, если используется datatype: "local". Вы используете datatype: "json". Это означает, что сервер хранить весь набор данных. url: '${pageContext.request.contextPath}/getTrucksJSONAction' получит запрос на на странице отсортированных и отфильтрованных данных. Сервер должен реализовывать сортировку, фильтрацию/сортировку и подкачку.

Существует специальный случай: один использует удаленный тип данных ("json" или "xml"), но один использует loadonce: true параметр дополнительно. В случае, если сервер должен вернуть все нефильтрованные данные вместо предоставления страницы данных. Возвращенные данные должны быть отсортированы в соответствии с параметром sortname, sortorder (который будет отправлен на сервер как sidx и sord). jqGrid отображает первую страницу возвращаемых данных, но заполняет внутренний параметр data целыми строками данных, возвращаемых с сервера. После первой загрузки данных jqGrid меняет datatype на "local", и поэтому последующая сортировка, пейджинг и фильтрация данных будут как в случае datatype: "local". В случае, когда вы сможете получить все данные с помощью grid.jqGrid("getGridParam", "data"), но вы можете сделать это в случае после данные будут загружены.

+0

спасибо за ваш ответ. Как обеспечить, чтобы мой сервер возвращал нефильтрованные данные вместо url/page данных. – Terry

+0

В этом проекте мы не хотим использовать параметр loadonce, потому что набор данных часто изменяется в базе данных. Поэтому давайте забудем о вариантах loadonce и data. Если я заменил grid.jqGrid («getGridParam», «data»); с Если я заменю var data = grid.jqGrid ("getRowData"); Я получаю правильно заполненный массив данных сетки. Но проблема в том, когда вызывается grid.trigger («reloadGrid»), значок truckArrived не изменяется с красного на зеленый, как ожидалось. Как я могу решить эту проблему? – Terry

+0

@Terry: Извините, но я не понимаю ваш вопрос. * Вы должны написать код как сервера, так и клиента *, а код клиента должен соответствовать серверу. Поэтому сначала вы должны проанализировать требования своего проекта и выбрать наилучший способ. – Oleg

Смежные вопросы