JqG​​rid:如何获取所有json数据,而不仅仅是属于列的那些?

时间:2016-03-25 05:15:52

标签: jquery json jqgrid

我有一个调用url来填充数据的jqGrid。我使用json作为数据类型。 我需要一些我不希望在网格中显示的行的信息。所以我带来的json具有比列更多的属性。 但是当我这样做时:

jQuery("#gridId").getRowData("2");

我只能看到与列相关联的数据。如何在json中查询并查询我不希望在网格中显示的数据。

例如我有JSON

{
   Id: 2,
   Name: Pepe,
   Profession: Doctor
}

我只想在网格中看到两列,Id和Name,但我想知道每一行在客户端的专业知识。

2 个答案:

答案 0 :(得分:2)

解决方案取决于您需要显示的总行数。如果行数不大(例如小于1000或小于10000),那么最好的选择是立即返回来自服务器的所有数据。您应添加loadonce: true选项以通知jqGrid读取所有数据并将其保存在内部data_index参数中。下一个重要步骤是设置页面大小不要太大,例如10,20或25. jqGrid将在加载所有数据之后显示第一个页数据服务器。默认情况下,jqGrid要求服务器返回已排序数据对应sortnamesortorder参数,这些参数将作为sidx和{{1}发送到服务器}。另一方面,可以使用附加选项sortd强制免费jqGrid在显示第一页之前对数据进行排序和过滤。

如果选择了上述方案,则可以使用forceClientSorting: true选项为服务器返回的每一行数据保存附加信息。例如,如果您希望保存每个数据项中存在的additionalProperties属性值,则可以使用Profession选项。之后,您可以使用additionalProperties: ["Profession"]按ID访问数据。方法getLocalRowgetLocalRow的工作速度非常快,因为它只返回对内部行对象的引用,该引用是从服务器响应中读取的。它包含getRowData中的所有name属性和colModel中的属性。

演示https://jsfiddle.net/OlegKi/g8ffxpv2/2/演示了这种方法。

您还询问了如何根据内容在某些行上设置additionalProperties。我建议您使用title设置该行的任何属性(rowattrtitleclass等等),请参阅the answer或使用style(请参阅the answerthis one)。

只有当一个人加载了非常大的数据且一个人无法使用cellattr选项时,才能定义虚拟隐藏列,例如loadonce: true而非使用{name: "Profession", hidden: true}。这种方式效果较差,但它会起作用。顺便说一句,additionalProperties中使用的属性值可以任何类型。例如,可以在属性(additionalPropertiesdetails)中的子网格数据的主数据数组的每个项目中包括。隐藏列不允许加载复杂数据,因为数据不仅仅是含铅,而是保存为隐藏列中的字符串(在列的subgrid元素中)。

答案 1 :(得分:1)

如果你使用Oleg的free-jqgrid并且版本是最新的那么你会这样做:

var theGrid = $("#grid");
var myData = [
{
   "Id": 1,
   "Name": "John",
   "Profession": "Doctor"
},
{
   "Id": 2,
   "Name": "Pepe",
   "Profession": "Doctor"
},
{
   "Id": 2,
   "Name": "Jane",
   "Profession": "Nurse"
}
];


theGrid.jqGrid({
    data : myData,
    colNames: ['Id', 'Name'],
    colModel: [
       {name: 'Id'},
       {name: 'Name'}
       ]
});

var allData = theGrid.jqGrid("getGridParam").data;
console.log(JSON.stringify(allData));

//show Pepe's Profession:
$.each(allData, function(i, v){
    if(v.Name === "Pepe")
    alert(v.Profession);
});

如果你没有使用Oleg的free-jqgrid,我强烈建议你这样做,因为你最终会更开心,并给予他非常好的支持。但是,如果您没有使用他的网格并且使用的是jqgrid版本4.6,那么无论您显示什么列,您仍然可以使用var allData = theGrid.jqGrid("getGridParam").data;从网格获取所有数据。

使用free-jqgrid 4.13.1的示例: FIDDLE

使用jqgrid 4.6的示例: FIDDLE

从Oleg的评论中添加: DEMO for json datatype