0

Web アプリケーションで jqgrid を使用しています。iOS 7 を使用して、jqgrid テーブルのすべての行を選択し、編集内容をデータベースに保存しようとすると、保存されません。1行を編集してから保存してから別の行を編集すると、基本的に一度に1行ずつ編集すると機能します。複数行の編集だけでは機能しません。また、iOS 7 でのみ機能しません。

私はすでにこの投稿を見ました: http://www.trirand.net/forum/default.aspx?g=posts&m=13688 jqgrid を最新のリリース (4.5.4) に更新しましたが、これはまだ同じですiOS7の問題。

レコードを送信するための JavaScript は次のとおりです。

function submitChange(tabId) {
 if (!submitFlag) return;
 var records=[];
 var $t = $("#" + tabId);
 var selectedIds = $t.jqGrid('getGridParam','selarrrow');
 var postData = $t.jqGrid("getGridParam", "postData");
 if (selectedIds.length > 0) {
  for (var i=0; i < selectedIds.length; i++){
   updatedList[selectedIds[i]] = composeEditedRecord(selectedIds[i]);  //Put edited record into updatedList
  }
 } else {
  alert($T('missing.msg'));
  return;
 }
 var z = 0;
 for (var key in updatedList) {
  if (typeof(updatedList[key].endDate) != 'undefined'
    && typeof(updatedList[key].endTypeId) != 'undefined') {
   records[z] = updatedList[key];
   z++;
  } else {
   alert($T('missing.msg'));
   return;
  }
 }

 if (records.length < $t.jqGrid('getGridParam', 'records')) {
  alert($T('missing.msg'));
  return;
 }
 $.extend(postData, {'updatedList': JSON.stringify(records)});

 $.post('mse/end', postData, function(data) {

  history.go(-1);
 });
}

また、jquery のバージョンは 1.5.1 です。

<link type="text/css" rel="stylesheet" href="css/jquery-ui-1.8.10.custom.css" />
<link type="text/css" rel="stylesheet" href="css/ui.jqgrid.css" media="screen" />
<link type="text/css" rel="stylesheet" href="css/ui.jqgrid.custom.css" media="screen" />


<script src="jquery/jquery.js" type="text/javascript" ></script>
<script src="jquery/ui/jquery-ui.js" type="text/javascript" ></script>
<script src="jquery/plugins/validate/jquery.validate.js" type="text/javascript" ></script>
<script src="jquery/plugins/jqgrid/i18n/grid.locale-en.js" type="text/javascript"></script>  
<script src="jquery/plugins/jqgrid/jquery.jqGrid.min.js" type="text/javascript"></script>

これが composeEditedRecord 関数です:

function composeEditedRecord(id) {
 var tmp = getEditableCells('mseTableEnd', id);
 var editedRecord = updatedList[id];
 if (!editedRecord) {
  editedRecord = {};
  editedRecord['id'] = id;
 }
 for (var key in tmp) {
  if (key == 'tag')
   editedRecord['TagPattern'] = tmp[key];
  else
   editedRecord[key] = tmp[key];
 }

 return editedRecord;
}

jqGrid の定義は次のとおりです。

$("#mseTableEnd").jqGrid({
        url: 'mse/list.json',
        sortname: 'guisid',
        colNames: mse.columnDisplayNames,
        colModel: mse.colModelDef,
        postData: filterValues,
        onSelectRow: function(id,status){
         if(status == true) {
    $('#mseTableEnd').jqGrid('editRow',id,true);
    $('#jqg_mseTableEnd_' + id).focus();
   } else if(status == false) {
    var tmp = getEditableCells('mseTableEnd', id);
       var record = composeEditedRecord(id);
       updatedList[id] = record; //Put edited record into updatedList when unchecked
       $('#mseTableEnd').jqGrid('restoreRow',id);
       $('#mseTableEnd').jqGrid('setRowData',id, tmp);
   }

  },
  onSelectAll: function(aRowids, status) {
   if (status){
        for (var i = 0; i < aRowids.length; i++)
         $('#mseTableEnd').jqGrid('editRow',aRowids[i],true);
        $('#jqg_mseTableEnd_' + aRowids[i-1]).focus();
       } else {
        for (var i = 0; i < aRowids.length; i++) {
         var tmp = getEditableCells('mseTableEnd', aRowids[i]);
         var record = composeEditedRecord(aRowids[i]);
              updatedList[aRowids[i]] = record; //Put edited record into updatedList when unchecked
         $('#mseTableEnd').jqGrid('restoreRow',aRowids[i]);
         $('#mseTableEnd').jqGrid('setRowData',aRowids[i], tmp);
        }
       }
  },
  gridComplete: function() {

   $("#mseTableEnd").setColProp('tag',{editable:false});   
     var columnsToHide = [];
   for (var i = 0; i <mse.colModelDef.length; i++) {
    if (i > 12) columnsToHide.push(mse.colModelDef[i].name);
   }
   columnsToHide.push('generation');
   $("#mseTableEnd").jqGrid('hideCol', columnsToHide);
   $("#mseTableEnd").jqGrid('showCol', ['enddate' 'comment']);  
  },
            loadComplete: function() { 
         var ids = $('#mseTableEnd').jqGrid('getDataIDs');
      for (var i = 0; i < ids.length; i++) {
       $('#mseTableEnd').setSelection(ids[i]); // All selected by default
             $('#'+ids[i]+' a').click(function(e) {
                 var myHash = e.currentTarget.hash;     // string like "#?id=0"
                 if (myHash.substring(0,5) === '#?id=') {
                     var id = myHash.substring(5,myHash.length); // getting row Id
                     var url = appContext.contextPath + '/mse/edit.do?mseId=' + id;
            hasPermissionByIds('Mse', id, 1, gotoPage, url);
                 }
                 e.preventDefault();
             });
         }
       }
    });

getEditableCells 関数は次のとおりです。

function getEditableCells(tabId, rowId) {
 var $t = $("#" + tabId);
 var ind = $t.jqGrid("getInd",rowId,true);
 var cm, nm, tmp={};

 $("td",ind).each(function(i) {
  cm = $t.jqGrid('getGridParam', 'colModel')[i];
  nm = cm.name;
  if ( nm != 'cb' && nm != 'subgrid' && cm.editable===true && nm != 'rn') {
   if (cm.edittype == "text") {
    if ($("input, textarea",this).length > 0)
     tmp[nm]=$("input, textarea",this).val();
    else {
     var rowData = $t.jqGrid('getRowData', rowId);
     tmp[nm]=rowData[nm];
    }
   }
  }
 });
 return tmp;
}

誰でも私を助けることができますか?

4

1 に答える 1

0

助けてくれてありがとう。投稿にgetEditableCells関数を入れました。

getEditableCells 関数の次の行に問題があることがわかりました。

if ($("input, textarea",this).length > 0)
 tmp[nm]=$("input, textarea",this).val();

テキストを次のように変更すると:

if ($("input",this).val().length > 0)
 tmp[nm]=$("input",this).val();

その後、問題は修正されますが、チェックボックスの選択を解除して再度選択すると、グリッド テーブルのテキスト フィールドに html が挿入されます。おそらく私のjquery構文に何か問題がありますか?

于 2013-10-24T16:01:02.387 に答える