0

我在我的 Web 应用程序中使用 jqgrid。使用 iOS 7,当我选择 jqgrid 表中的所有行并尝试将我的编辑保存到数据库中时,它不会保存。如果我只是编辑一行然后保存然后编辑另一行 - 基本上如果我一次编辑一行 - 那么它就可以工作。只是多行编辑不起作用。而且它只在 iOS 7 上不起作用。

我已经看过这篇文章:http ://www.trirand.net/forum/default.aspx? g=posts&m=13688 我已经将我的 jqgrid 更新到最新版本(4.5.4),我仍然有这个相同iOS 7 上的问题。

这是提交记录的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 回答