我正在寻找存储每行数据的最佳方法。我发现了使用隐藏列的一种工作方式(在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参数。因此,无需创建输入数据中存在的隐藏列prop1prop2,您只需使用additionalProperties: ["prop1", "prop2"]即可。它通知jqGrid从输入中读取数据。可以对additionalProperties项目使用稍微复杂一些的内容,以读取更复杂的数据并将其与行关联。用法additionalProperties的主要优点:在自定义格式程序中可以访问指定的属性,如果使用loadonce: true,则这些属性将保存在本地。

如果有人使用TreeGrid,则可以看到许多隐藏的列(levelparentisLeafexpandedloadedicon),这些列另外存储在本地数据中。由于jqGrid的许多版本,内部未使用隐藏列。从4.9版开始,免费的jqGrid不会创建不需要的列并使页面的DOM更短。在这种情况下,免费的jqGrid使用additionalProperties(请参阅the wiki article)。

在当前无法迁移到免费的jqGrid的情况下,则可以使用另一种解决方法。可以使用userdata保存与网格关联的其他信息。可以将userdata直接包含在服务器响应中并提供所有必需的信息,或者可以使用beforeProcessing回调解析输入数据并在jqGrid解析输入数据之前填充其他userdata。我建议阅读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访问其他属性。

10-04 22:32
查看更多