2012-07-31 25 views
1

我有一個jqGrid,允許內聯編輯/添加數據。當用戶雙擊該行時,內聯編輯開始。當用戶按下輸入或點擊另一行時,我想要保存更改。但是,由於某種原因,在saveRow函數被調用之前該行正在恢復,並且我的編輯未保存(AJAX調用從不發生)。jqGrid - 在saveRow之前調用的aftersavefunc

我的代碼如下所示。當我按下回車鍵時,我的更改被保存併發送到服務器。當我點擊另一行時,我的更改不會發送到服務器(無AJAX調用),並且我在控制檯中看到在saveEdit之前調用afterrestorefunc。

var editParams = { 
    afterSubmit: processResponse, 
    successfunc: function(response) { 
     var processed = processResponse(response); 
     if(processed[0] !== true) { 
      $.jgrid.info_dialog($.jgrid.errors.errcap, processed[1], $.jgrid.edit.bClose); 
     } 
     return processed[0]; 
    }, 
    afterrestorefunc: function(id) { 
     console.log('afterrestorefunc - ' + id); 
    }, 
    bottominfo: 'Fields marked with an (*) are required', 
    keys: true 
}, 
    zipEditParams = $.extend(true, {}, editParams, {url: 'editdata.php'}); 
/* Set global default options */ 
$.extend($.jgrid.defaults, { 
    grouping: true, 
    shrinkToFit: false, 
    rowList: [10, 20, 30, 40, 50, 100], 
    rowNum: 20, 
    repeatitems: false, 
    ondblClickRow: inlineEdit, 
    onSelectRow: saveEdit 
}); 
$('#zipcodes') 
    .jqGrid({ 
     datatype: 'json', 
     colNames: ['Zip', 'City', 'State', 'Country'], 
     colModel: [ 
      {name: 'zip_zip', jsonmap: 'zip_zip', width: 75, editable: true, editrules: {required: true}, formoptions: {elmprefix: '(*) '}}, 
      {name: 'zip_city', jsonmap: 'zip_city', width: 75, editable: true, editrules: {required: true}, formoptions: {elmprefix: '(*) '}}, 
      {name: 'zip_state', jsonmap: 'zip_state', width: 75, editable: true, editrules: {required: true}, formoptions: {elmprefix: '(*) '}}, 
      {name: 'zip_country', jsonmap: 'zip_country', width: 75, editable: true, editrules: {required: true}, formoptions: {elmprefix: '(*) '}} 
     ], 
     height: 200, 
     ignoreCase: true, 
     jsonReader: { repeatitems: false, id: 'zip_zip' }, 
     pager: '#zipcodes_pager', 
     url: 'data.php', 
     editurl: 'editdata.php' 
    }) 
    .jqGrid('navGrid', '#zipcodes_pager', {add: false, edit: false, del: false, refresh: false, search: false}) 
    .jqGrid('inlineNav', '#zipcodes_pager', {edit: true, save: true, cancel: false, editParams: zipEditParams}); 

var lastSel; 
/* Start editing the row */ 
function inlineEdit(id, iRow, iCol) { 
    var editParams = this.id == 'zipcodes' ? zipEditParams : (this.id == 'labels' ? labelEditParams : (this.id == 'users' ? userEditParams : {})); 
    $(this).jqGrid('editRow', id, editParams); 
    focusRow(id, iCol, this); 
} 

function focusRow(id, iCol, table) { 
    var ele = document.getElementById(id + '_' + table.p.colModel[iCol].name), 
     length = ele.value.length; 
    ele.focus(); 
    if(ele.setSelectionRange) { //IE 
     ele.setSelectionRange(length, length); 
    } 
    else if(ele.createTextRange) { 
     var range = ele.createTextRange(); 
     range.collapse(true); 
     range.moveEnd('character', length); 
     range.moveStart('character', start); 
     range.select(); 
    } 
} 

function saveEdit(id) { 
    if(id && id != lastSel) { 
     console.log('saveRow: ' + this.id + ' - ' + lastSel); 
     /* Save the last selected row before changing it */ 
     var saveParams = zipEditParams; 
     $(this).jqGrid('saveRow', lastSel, saveParams); 
     lastSel = id; 
    } 
} 

function processResponse(response) { 
    console.log('processResponse'); 
    var obj = $.parseJSON(response.responseText), 
     retVal = true, 
     message = '', 
     new_id = ''; 
    if(obj.message) { 
     if(obj.message == 'not logged in') { 
      location.href = 'logout.php'; 
     } 
     else if(obj.message != 'true') { 
      message = obj.message; 
      retVal = false; 
     } 
    } 
    return [retVal, message, new_id]; 
} 

任何有關這個問題的幫助是非常感謝。

UPDATE看來如果我註釋掉.jqGrid('inlineNav', '#zipcodes_pager', {edit: true, save: true, cancel: false, editParams: zipEditParams});,那麼一切都按預期工作。我也嘗試過使用.jqGrid('inlineNav', '#zipcodes_pager');,但看到了相同的結果。這很好,可以在短期內工作,但如果可能的話,我仍然希望內聯添加功能。

回答

1

我認爲你需要更多的功能在這個代碼我沒有做編輯在選擇行添加到您的onSelectRow功能

onSelectRow: function (id) { 
     if (id && id !== lastsel) { 
     // cancel editing of the previous selected row if it was in editing state. 
     // jqGrid hold intern savedRow array inside of jqGrid object, 
     // so it is safe to call restoreRow method with any id parameter 
     // if jqGrid not in editing state 
     if (typeof lastsel !== "undefined") { 
     jQuery("#grid").jqGrid('restoreRow', lastsel); 
     } 
    lastSel = id; 
    } 
    }, 

,但你可以看到,你需要恢復到以前的選定的行,如果該行處於編輯模式,並且您點擊其他行。

試試這個。

+0

我不想恢復最後選擇的行,我想保存最後選擇的行。我調用'jQuery('#grid')。jqGrid('saveRow',lastSel,saveParams)'來做到這一點。就像我在我的問題中所說的那樣,aftersavefunc似乎在saveRow func之前被調用。對我而言,這表明該行由於某種原因自動恢復。有什麼想法嗎? – Kyle 2012-08-01 12:38:34

+0

我用剛發現的東西更新了我的問題。也許這可能有幫助。 – Kyle 2012-08-01 12:44:51

+0

好友,這個saveRow方法在內部調用editRow,如果沒有爲它指定單獨的url。我給你的鏈接將保存該行,如果你正在編輯並按下保存點擊進入,同時如果你的一行已經處於編輯模式,並且你選擇了另一行,那麼你的上一行很明顯不應該處於編輯模式,應該恢復到兩個正常狀態,否則在編輯模式下會有兩行,請查看此鏈接http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing這將保存你的行,這是行內編輯模式。 – 2012-08-01 13:06:33

相關問題