存储相关行数据?
Store related row data?
我正在寻找存储每行数据的最佳方式。我找到了一种使用隐藏列的工作方式(hidden: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 从输入中读取数据。可以使用更复杂的 for on additionalProperties
项来读取更复杂的数据并将 关联到行。使用 additionalProperties
的主要优点:指定的属性可以在自定义格式化程序中访问,如果使用 loadonce: true
,属性将保存在本地。
如果有人使用 TreeGrid,那么可以看到许多隐藏的列(level
、parent
、isLeaf
、expanded
、loaded
、icon
) 额外保存在本地数据中。由于 jqGrid 的许多版本,隐藏列并未在内部使用。从 4.9 版开始,免费的 jqGrid 不会创建不需要的列并使页面的 DOM 变短。 free jqGrid 在案例中使用 additionalProperties
(参见 the wiki article)。
如果目前无法迁移到免费的 jqGrid,则可以使用另一种解决方法。可以使用 userdata
来保存与网格相关的附加信息。可以在服务器响应中直接包含 userdata
和所有必需的信息,也可以使用 beforeProcessing
回调来解析输入数据并在 userdata
before 输入数据将由 jqGrid 解析。我建议阅读 the old answer 以获取相应的代码示例。主要思想是通过 rowid 将 userdata
构建为地图。地图的项目应包含附加属性:
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
访问其他属性。
我正在寻找存储每行数据的最佳方式。我找到了一种使用隐藏列的工作方式(hidden: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 从输入中读取数据。可以使用更复杂的 for on additionalProperties
项来读取更复杂的数据并将 关联到行。使用 additionalProperties
的主要优点:指定的属性可以在自定义格式化程序中访问,如果使用 loadonce: true
,属性将保存在本地。
如果有人使用 TreeGrid,那么可以看到许多隐藏的列(level
、parent
、isLeaf
、expanded
、loaded
、icon
) 额外保存在本地数据中。由于 jqGrid 的许多版本,隐藏列并未在内部使用。从 4.9 版开始,免费的 jqGrid 不会创建不需要的列并使页面的 DOM 变短。 free jqGrid 在案例中使用 additionalProperties
(参见 the wiki article)。
如果目前无法迁移到免费的 jqGrid,则可以使用另一种解决方法。可以使用 userdata
来保存与网格相关的附加信息。可以在服务器响应中直接包含 userdata
和所有必需的信息,也可以使用 beforeProcessing
回调来解析输入数据并在 userdata
before 输入数据将由 jqGrid 解析。我建议阅读 the old answer 以获取相应的代码示例。主要思想是通过 rowid 将 userdata
构建为地图。地图的项目应包含附加属性:
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
访问其他属性。