使用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,为什么我现在得到这个对象?
答案 0 :(得分:11)
我想你使用loadonce:true
选项。这是一个带来许多问题的选项(主要是理解问题)。在jqGrid版本3.7中引入新的本地排序,分页和过滤(搜索)功能之前,本地和远程数据之间的分离是明确的。从jqGrid版本3.7开始,loadonce:true
选项允许您在首次加载时拥有的远程数据与稍后的本地数据之间进行混合。在another answer中已经讨论过密切问题。在loadonce:true
选项使用的情况下,在加载过程结束时,jqGrid的datatype
将更改为'local'
。在那之后,许多事情都有所不同。
我建议您使用jQuery.isArray(rowObject)作为一种快速有效的方法来确定是否应该访问每个整数索引rowObject
rowObject[3]
(如果您访问远程数据)或每个命名属性{ {1}}。
您可以使用rowObject.projectId
查看整个本地数据,该数据会返回所有本地$("#list").jqGrid('getGridParam','data')
的数组。
如果某些列中的jqGrid中您需要访问的数据(rowObject
)未保存,则您将无法在{{1}中看到相关信息}。如果您可以为数据使用其他隐藏列,或者在任何外部对象中rowObject[3]
内的第一次加载时保存数据。您可以测试rowObject
是loadComplete: function(data) { ... }
(或$("#list").jqGrid('getGridParam','datatype')
取决于您的服务器数据),如果是,您可以保存从您需要的服务器返回的所有数据(来自3-对象的外部数组中的'json'
数组的第th列)。因此,您可以稍后在自定义格式化程序中访问数据。
更新:问题在jqGrid的free jqGrid分叉中得到解决。出于兼容性原因,自定义格式化程序(以及'xml'
,data
)仍包含cellattr
参数,但存在其他 rowattr
属性,其中已解析数据保存为命名属性:
rowObject
可以使用
rowData
formatter: function (cellValue, options, rowObject) {
// either rowObject[1] or rowObject.site_id,
// but options.rowData.site_id works ALWAYS
}
中的。