带有jqgrid rowObject的结果的第一页返回预期数据,但随后的结果页返回不完整的数据。为什么?
第一页结果:
rowObject [3]等于“2”
后续结果页面:
rowObject [3]等于“undefined”,返回结果的第一页现在也等于“undefined”。
更多详细信息和一些代码:
使用jqGrid时,如果要实现自定义格式化程序,请使用一个名为rowObject的参数,其中包含行数据。因此,例如,一行rowObject可能类似于:
["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""]
因此,我的自定义格式化程序使用其中一些数据来准备链接,如下所示:
var newval = '<a href="/proj/' + rowObject[3] + '/images/' + imgval + '">' + imgval + '</a>';
这给了我一个像这样的网址:
<a href="/proj/3/images/photo.jpg">photo.jpg</a>
到现在为止还挺好。我的问题是,当我转到jqgrid中结果的下一页时,我丢失了一些数据并得到:
<a href="/proj/undefined/images/photo.jpg">photo.jpg</a>
如果我加载显示所有结果的页面,则一切正常,但是,如果使用分页,则只有结果的第一页将具有rowObject [3]的正确值,而后续页面上的所有其他结果将不具有该rowObject的值!
那么,为什么rowObject包含有关最初加载到网格中的内容的正确数据,并且在出现网格结果的下一页时似乎丢失了该数据?
我在Firebug中看到的一件事我不明白...当页面最初加载时,我得到了:
console.log(rowObject);
["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""]
在结果的下一页,一切都按预期停止了,我看到了
console.log(rowObject);
Object { photo_id="18", site_id="133", more...}
为什么要改变?第一个结果是json,那么为什么现在我得到这个Object?
最佳答案
我想您使用loadonce:true
选项。它是带来很多问题(主要是理解问题)的一种选择。在3.7版的jqGrid中引入新的本地排序,分页和过滤(搜索)功能之前,本地数据和远程数据之间的分隔已很清楚。从jqGrid版本3.7开始,loadonce:true
选项允许您在第一次加载的远程数据和以后加载的本地数据之间混合使用。在another answer中,已经讨论了紧密的问题。如果使用loadonce:true
选项,则在加载过程结束时,jqGrid的datatype
将更改为'local'
。之后,许多事情就不同了。
我建议您使用jQuery.isArray(rowObject)作为快速有效的方法来确定是应按整数索引rowObject
(如果访问远程数据)还是按命名属性rowObject[3]
访问rowObject.projectId
。
您可以使用$("#list").jqGrid('getGridParam','data')
查看整个本地数据,该数据返回所有本地rowObject
的数组。
如果您需要访问的数据(rowObject[3]
)未在某些列的jqGrid中保存,那么您将无法在rowObject
中查看信息。在这种情况下,您可以为数据使用附加的隐藏列,或在第一次加载时将数据保存在任何外部对象的loadComplete: function(data) { ... }
内部。您可以测试$("#list").jqGrid('getGridParam','datatype')
是'json'
(或'xml'
取决于您的服务器数据),如果为true,则可以将从服务器返回的所有需要的数据(在data
数组的第3列中)保存在一个外部数组中目的。这样一来,您以后就可以在自定义格式化程序中访问数据。
更新了:在jqGrid的free jqGrid分支中解决了该问题。出于兼容性原因,自定义格式化程序(以及cellattr
和rowattr
)仍包含rowObject
参数,但是存在其他rowData
属性,其中已解析的数据另存为命名属性:
formatter: function (cellValue, options, rowObject) {
// either rowObject[1] or rowObject.site_id,
// but options.rowData.site_id works ALWAYS
}
一个可以使用
cellattr: function (rowid, cellValue, rowObject, cm, item) {
// either rowObject[1] or rowObject.site_id,
// but item.site_id works ALWAYS
}
在
cellattr
中。