因此,我试图做的是在jqgrid上完成本地删除后触发一个事件。这样做的原因是因为我正在处理网站上的全局保存,所以我没有直接发布到服务器。我将数据以JSON形式存储在页面上的隐藏元素中,以便当用户最终保存元素时,该元素的值将与所有其他数据一起发送到服务器。
我遇到的问题是,当我从jqgrid删除一行时,我无法使用更改来更新隐藏的元素,因此,如果用户在此之后进行保存,就好像从未发生过删除操作。
$("#translationMappingGrid").jqGrid({
data: mydata,
datatype: "local",
mtype: 'GET',
colNames:['From','To', 'Type'],
colModel :[
{name:'from',index:'from', width:180, align:"left",sorttype:"float", editable: true, editrules:{custom:true, custom_func:validateIPGridInput}},
{name:'to',index:'to', width:180, align:"left",sorttype:"float", editable: true, editrules:{custom:true, custom_func:validateIPGridInput}},
{name:'type',index:'type', width:200,align:"left",sorttype:"float", editable: true,
edittype:"select", formatter:'select', editoptions:{
value:"0:Never Translate;1:Always Translate;2:Only If Source;3:Only If Destination"}
},
],
pager: '#pager',
rowNum:10,
rowList:[10,20,30],
sortname: 'invid',
sortorder: 'desc',
viewrecords: true,
gridview: true,
caption: 'Mapping',
editurl: 'probe.sysinfo.ajax',
url:'clientArray',
onSelectRow: function(id){
jQuery('#translationMappingGrid').jqGrid('restoreRow',lastsel2);
//below are the parameters for edit row, the function is called after a successful edit has been done
//jQuery("#grid_id").jqGrid('editRow',rowid, keys, oneditfunc, succesfunc, url, extraparam, aftersavefunc,errorfunc, afterrestorefunc);
jQuery('#translationMappingGrid').jqGrid('editRow',id,true,"","","","",function () {
setTranslationMappingJSON(getGridDataJSONString(this));
window.parent.document.getElementById('notificationDiv').style.display= "";
});
lastsel2=id;
},
afterInsertRow: function(rowid, rowdata, rowelem ){
//alert("after insert row");
setTranslationMappingJSON(getGridDataJSONString(this));
window.parent.document.getElementById('notificationDiv').style.display= "";
}
});
//adds buttons to jqgrid nav bar
jQuery("#translationMappingGrid").navGrid('#pager',{
edit:false,add:true,del:true,search:false,refresh:true
}, {
closeAfterAdd:true,
closeAfterEdit: true
},
{
closeAfterAdd:true,
closeAfterEdit: true,
afterSubmit: function(response, postdata) {
alert("after complete row");
setTranslationMappingJSON(getGridDataJSONString(this));
window.parent.document.getElementById('notificationDiv').style.display= "";
return [true,""];
}
});
如上面的代码所示,我通过afterrestorefunc成功地通过添加和编辑(内联)上的更改成功更新了隐藏元素,但这不适用于删除。
我已经尝试在上面的代码中使用afterSubmit,但这也不起作用。我已经为此工作了几天,得出的结论是,我可能必须为删除按钮完全编写自己的自定义代码,但我希望情况并非如此。
OP在编辑中写道:
所以看来,我盯着这个问题太久了,却没有发现明显的问题。。。我发现了两件事:
使用afterSubmit是错误的用法,相反,我应该使用afterComplete。
我在尝试afterSubmit之前尝试使用afterComplete,它之所以无法正常工作,是因为我将它们都放在了“ add”参数中,而不是删除中。再一次,我对那一个感觉很棒:)
现在我已经知道这里是拯救我生命的代码片段:
jQuery("#translationMappingGrid").navGrid('#pager',{ edit:false,add:true,del:true,search:false,refresh:true }, { closeAfterAdd:true, closeAfterEdit: true }, { closeAfterAdd:true, closeAfterEdit: true },{ afterComplete: function () { //saves the changed JSON string to the hidden element setTranslationMappingJSON(getGridDataJSONString(jQuery('#translationMappingGrid'))); window.parent.document.getElementById('notificationDiv').style.display= ""; } });
这已经过测试,执行删除后会调用该函数,并将本地更改保存到我的隐藏元素中。
对于任何对格式是好奇的人:
/* The following is the setup navGrid(<name>, {<buttons, true/false}, { <edit parameters> }, { <add parameters> }, { <delete parameters> } */
感谢可能已经开始从事此工作的每个人,当然要感谢jqgrid的开发人员。我曾经使用过的最好的JavaScript网格!