我使用jqGrid(简化)
以下列 { name: "PMOPerson", index: "PMOPerson", width: 250, editable: true, edittype: "select", editoptions: { dataUrl: "/Person/GetSelectData" }, editrules: { required: false} },
{ name: "HeadDisplayName", index: "HeadDisplayName", width: 150, editable: false },
当我通过调出编辑对话框来编辑一行时,需要10秒才能填充PMOPerson下拉列表。即使在我之前已经加载过一次之后也是如此,我认为这是因为我有recreateForm:在下面是
addButton({
caption: "",
title: "Edit Selected Team",
buttonicon: 'ui-icon-pencil',
onClickButton: function () {
var id = $("#grid").getGridParam("selrow");
if (id) {
jQuery("#grid").jqGrid('editGridRow', id,
{ url: '/OrganisationalUnit/Update', afterSubmit: function (response, postdata) {
var responseJson = $.parseJSON(response.responseText);
return HandleJqGridResponse(responseJson);
},
height: 380, width: "auto", recreateForm: true, closeAfterEdit: true,
closeOnEscape: true, reloadAfterSubmit: true
});
}
},
position: "second"
});
我试图找出是否有一种方法可以同时使用recreateform:true但仍然会缓存dataUrl中的项目列表,以避免每次编辑行时都返回服务器。
答案 0 :(得分:1)
我回答了非常接近的问题here和here。换句话说,您可以使用HTTP标头的缓存选项,也可以使用editoptions.value
代替editoptions.dataUrl
。
我在the answer和前两个(this和this)中描述了如何在editoptions.value
回调中动态设置beforeProcessing
。需要扩展来自用于填充网格的服务器的响应以及其他信息(使用从editoptions.dataUrl
返回的数据等数据)。在我看来,它实现了editoptions.dataUrl
数据缓存和重新加载网格刷新数据之间的最佳折衷。仍然可以在服务器端保存缓存的editoptions.dataUrl
数据 。
或者,可以使用更简单的方法,在创建网格后向editoptions.dataUrl
创建手动 Ajax请求,并且可以在{{1}内设置editoptions.value
}(success
)回调Ajax请求。代码将涉及以下
done
// create grid
$("#grid").jqGrid({
colModel: [
{ name: "PMOPerson" },
...
],
...
});
// make separate asynchronous Ajax request to the server and set
// edittype: "select", editoptions: { value: ... }
setSelectOptionValues("/Person/GetSelectData", $("#grid"), "PMOPerson");
的代码取决于您用来与setSelectOptionValues
等网址进行通信的JSON数据的格式。例如,如果服务器返回的字符串数组应该是"/Person/GetSelectData"
的文本和选项的值,那么可能是以下
<select>
var setSelectOptionValues = function (getJsonUrl, myGrid, colModelColumnName) {
$.getJSON(
getJsonUrl,
function (data) {
var i, selectedOptions = '', datai, dn, colModelColumn;
for (i = 0; i < data.length; i += 1) {
if (i > 0) {
selectedOptions += ';';
}
else {
selectedOptions = "";
}
datai = data[i];
if (typeof datai === 'string') {
selectedOptions += datai;
selectedOptions += ':';
selectedOptions += datai;
}
}
myGrid.jqGrid("setColProp", colModelColumnName, {
edittype: "select",
editoptions: { value: selectedOptions }
});
}
);
};
的设置将在editoptions.value
内以异步完成。因此,可以在设置setSelectOptionValues
之前填充网格。另一方面editoptions.value
将仅在编辑期间用于。 editoptions.value
的响应时间通常足够快,在用户开始编辑之前,将设置值"/Person/GetSelectData"
。如果你想绝对确定你仍然可以持有editoptions.value
。如果editoptions.dataUrl
仅在用户快速作为服务器并且在editoptions.dataUrl
上进行响应时才会使用"/Person/GetSelectData"
。您可以更改
setSelectOptionValues("/Person/GetSelectData", $("#grid"), "PMOPerson");
使用colModel
获取getGridParam
,循环浏览所有colModel
项,并为setSelectOptionValues
的所有项目调用editoptions.dataUrl
。
最后一种方法的主要限制:您不能使用formatter: "select"
(仅限edittype: "select"
)。如果您使用ID填充网格数据,并且editoptions.value
或formatoptions.value
提供了ID到文本的映射,那么我建议您使用第一种方法进行beforeProcessing
回调。