我有一個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');
,但看到了相同的結果。這很好,可以在短期內工作,但如果可能的話,我仍然希望內聯添加功能。
我不想恢復最後選擇的行,我想保存最後選擇的行。我調用'jQuery('#grid')。jqGrid('saveRow',lastSel,saveParams)'來做到這一點。就像我在我的問題中所說的那樣,aftersavefunc似乎在saveRow func之前被調用。對我而言,這表明該行由於某種原因自動恢復。有什麼想法嗎? – Kyle 2012-08-01 12:38:34
我用剛發現的東西更新了我的問題。也許這可能有幫助。 – Kyle 2012-08-01 12:44:51
好友,這個saveRow方法在內部調用editRow,如果沒有爲它指定單獨的url。我給你的鏈接將保存該行,如果你正在編輯並按下保存點擊進入,同時如果你的一行已經處於編輯模式,並且你選擇了另一行,那麼你的上一行很明顯不應該處於編輯模式,應該恢復到兩個正常狀態,否則在編輯模式下會有兩行,請查看此鏈接http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing這將保存你的行,這是行內編輯模式。 – 2012-08-01 13:06:33