我正在寻找存储每行数据的最佳方式。我找到了一种使用隐藏列的工作方式(隐藏:在colModel中为true),但该选项仍然会为隐藏的单元格创建DOM节点,这对我来说似乎是一种浪费。还有更好的办法吗?
答案 0 :(得分:1)
首先应指定如何使用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
参数。因此,您可以使用prop1
而不是创建输入数据中存在的隐藏列prop2
和additionalProperties: ["prop1", "prop2"]
。它通知jqGrid从输入中读取数据。可以对additionalProperties
项使用更复杂的内容来读取更复杂的数据并将其关联到行。使用additionalProperties
的主要优点:可以在自定义格式化程序中访问指定的属性,如果使用loadonce: true
,属性将保存在本地。
如果有人使用了TreeGrid,那么可以看到许多隐藏的列(level
,parent
,isLeaf
,expanded
,loaded
,icon
)另外保存在本地数据中。由于许多版本的jqGrid,内部未使用隐藏列。从版本4.9开始,free jqGrid不会创建不需要的列,并且会缩短页面的DOM。免费jqGrid在案例中使用additionalProperties
(请参阅the wiki article)。
在一个当前无法迁移到免费的jqGrid,然后可以使用另一种解决方法。可以使用userdata
来保存与网格关联的其他信息。可以直接在服务器响应中包含userdata
并提供所有必需信息,也可以使用beforeProcessing
回调来解析输入数据,并在之前填充其他userdata
输入数据将由jqGrid解析。我建议您阅读the old answer以获取相应的代码示例。主要思想是将userdata
构建为mapid map by mapid。地图的项目应包含其他属性:
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
访问其他媒体资源。