我有一个案例,我在jqGrid中有多个列,它们使用相同的列表来填充下拉列表。
{ name: "Manager", index: "Manager", width: 120, editable: true, edittype: "select", editoptions: { dataUrl: "/Person/GetSelectData" }, editrules: { required: false} },
{ name: "Delegate", index: "Delegate", width: 120, editable: true, edittype: "select", editoptions: { dataUrl: "/Person/GetSelectData" }, editrules: { required: false} },
我想知道是否有办法在没有两个单独的ajax调用相同操作的情况下让上面的工作只是为了得到相同的数据列表:
dataUrl: "/Person/GetSelectData"
所以我可以调用一次,并将项目列表链接到两列?这在jqGrid中可能吗?
答案 0 :(得分:1)
您想要的任何实现都意味着"/Person/GetSelectData"
的某种数据缓存。我更喜欢自己的一种方法是使用value
代替dataUrl
。选择值列表可以包含在的主服务器中,它将填充网格。如果url
中使用的操作可以返回其他数据。您可以使用定义为函数的value
内部返回的数据,也可以在value
内部设置beforeProcessing
。为了使我的建议更清楚,我在一个例子中解释它。
第一种方式:使用value
作为函数。可以包含您通常在主JSON响应中的"/Person/GetSelectData"
内返回的数据。例如,您可以使用userdata
(或输入数据的任何其他扩展名):
{
"rows": [
...
],
"userdata": {
"Persons": "Bill:Bill;Oleg:Oleg;Leora:Leora"
}
}
然后可以使用
beforeProcessing: function (data) {
var $self = $(this), userData = data.userdata, persons, selectOptions;
if (userData && userData.Persons) {
persons = userData.Persons;
selectOptions = {
searchoptions: { value: ":All;" + persons }, // for toolbar search
stype: "select",
editoptions: { value: persons },
edittype: "select"
};
$self.jqGrid("setColProp", "Manager", selectOptions);
$self.jqGrid("setColProp", "Delegate", selectOptions);
}
}
顺便说一句,人们甚至可以使用formatter: "select"
作为“经理”和“委托”列。它允许使用id而不是名称。例如
"Persons": "3:Bill;1:Oleg;2:Leora"
还应将formatter: "select"
添加到selectOptions
。它允许在主数据(3
部分JSON数据)中使用ID 1
,2
和rows
。使用dataUrl
的标准方式不允许使用formatter: "select"
。
我建议您阅读the answer,this one和this one,了解有关动态修改网格的使用beforeProcessing
的更多信息。