【发布时间】:2016-01-01 04:06:43
【问题描述】:
我正在寻找存储每行数据的最佳方式。我找到了一种使用隐藏列的工作方式(在 colModel 中隐藏:true),但该选项仍会为隐藏单元格创建 DOM 节点,这对我来说似乎是一种浪费。有没有更好的办法?
【问题讨论】:
我正在寻找存储每行数据的最佳方式。我找到了一种使用隐藏列的工作方式(在 colModel 中隐藏:true),但该选项仍会为隐藏单元格创建 DOM 节点,这对我来说似乎是一种浪费。有没有更好的办法?
【问题讨论】:
首先应该指定如何使用jqGrid。如果使用datatype: "local",则无需创建任何隐藏列。而不是输入数据可以包含像
{ id: 123, name: "item name", price: 45.67,
orders: [
{ total: 1543.54, data: "2015-10-02" }
{ total: 1633.71, data: "2015-10-01" }
] }
并且orders 数组将作为每个项目的一部分保存在data 数组中。换句话说,您可以保存任何数量的任何类型的附加属性,这些属性将保存在本地数据中。可以使用getLocalRow 方法获取所有数据。例如,可以使用 $("#grid").jqGrid("getLocalRow", "123") 之类的东西来获取与 id="123" 的行关联的数据。
如果使用datatype: "json" 并从服务器加载数据,则可以使用另一种选项。免费 jqGrid 4.9 及更高版本支持additionalProperties 参数。因此,您可以使用additionalProperties: ["prop1", "prop2"],而不是创建存在于输入数据中的隐藏列prop1 和prop2。它通知 jqGrid 从输入中读取数据。可以对additionalProperties 项使用更复杂的 for 来读取更复杂的数据并将 关联到行。使用additionalProperties 的主要优点:可以在自定义格式化程序中访问指定的属性,如果使用loadonce: true,属性将保存在本地。
如果有人使用 TreeGrid,则可以看到许多隐藏列(level、parent、isLeaf、expanded、loaded、icon),这些列还保存在本地数据中。由于 jqGrid 的许多版本,内部未使用隐藏列。从 4.9 版开始,免费 jqGrid 不会创建不需要的列并使页面的 DOM 更短。免费jqGrid在本例中使用additionalProperties(见the wiki article)。
如果当前无法迁移到免费 jqGrid,则可以使用另一种解决方法。可以使用userdata 来保存与网格相关的附加信息。可以在服务器响应中直接包含userdata 以及所有必需的信息,也可以使用beforeProcessing 回调来解析输入数据并填充额外的userdata在输入数据将被解析之前jq网格。我建议阅读the old answer 以获取相应的代码示例。主要思想是将userdata 构建为rowid 的映射。地图的项目应包含附加属性:
userdata: {
/* properties of userdata could be the rowids */
123: {
/* the data could contains the object with additional properties */
orders: [
{ total: 1543.54, data: "2015-10-02" }
{ total: 1633.71, data: "2015-10-01" }
]
}
}
它允许使用
var addProp = $(this).jqGrid("getGridParam", "userData");
并使用addProp[rowid].orders 访问其他属性。
【讨论】:
additionalProperties 选项从免费 jqGrid 4.9 版开始存在。我在the wiki article 上包含了参考,并在我的回答中描述了该选项。如果你使用旧版本的 jqGrid (4.6.0) 那么它没有这样的选项,你必须使用 userData 例如。
additionalProperties 选项存在于jqGrid 的free jqGrid 分支中,而在trirand.com/jqgridwiki/doku.php?id=wiki:jqgriddocs 中描述的4.6.0 版本中不存在。