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

JqGrid: How get all the json data, not just those who belongs to a column?

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

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

我只能看到与列相关联的数据。如何在 json 中获取和查询我不想在网格中显示的数据。

例如我在 JSON

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

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

如果您使用的是 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

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

如果选择上述方案,则可以使用 additionalProperties 选项为从服务器 return 编辑的每一行数据保存 附加信息 .例如,如果您想保存每个数据项中存在的 Profession 属性 的值,那么您可以使用 additionalProperties: ["Profession"] 选项。之后,您可以使用 getLocalRow 通过 id 访问数据。方法 getLocalRow 的工作速度比 getRowData 快得多,因为它 return 只是对内部行对象的引用,它是从服务器响应中读取的。它包含 colModel 的所有 name 属性和 additionalProperties.

的属性

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

您还询问了如何根据内容在某些行上设置 title。我建议您使用 rowattr 来设置行的任何属性(titleclassstyle 等等),请参阅 the answer or to use cellattr (see the answer or this one)。

只有在加载非常大的数据并且不能使用 loadonce: true 选项时才可以定义虚拟隐藏列,例如 {name: "Profession", hidden: true} 而不是使用 additionalProperties。方法不太有效,但它会起作用。顺便说一下,additionalProperties 中使用的属性值可以有 任何类型 。例如可以在属性(detailssubgrid)中包含子网格数据的主数据数组的每一项。隐藏列不允许加载复杂数据,因为数据不仅讨厌被引导,而且讨厌在隐藏列中保存为字符串(在列的 <td> 元素中)。