Lot*_*har 9 javascript jquery jqgrid
使用jqgrid rowObject的结果的第一页返回预期数据,但随后返回结果的后续页面的不完整数据.为什么?
结果的第一页:rowObject [3]将等于"2"
后续结果页:rowObject [3]将等于"undefined",返回结果的第一页现在也将等于"undefined".
更多细节和一些代码:
使用jqGrid,如果要实现自定义格式化程序,可以使用名为rowObject的参数,该参数包含行数据.因此,例如,一行rowObject可能是这样的:
["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""]
Run Code Online (Sandbox Code Playgroud)
所以我的自定义格式化程序使用这些数据中的一些来准备链接,如下所示:
var newval = '<a href="/proj/' + rowObject[3] + '/images/' + imgval + '">' + imgval + '</a>';
Run Code Online (Sandbox Code Playgroud)
这给了我一个网址:
<a href="/proj/3/images/photo.jpg">photo.jpg</a>
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我的问题是当我在jqgrid中转到结果的下一页时,我丢失了一些这样的数据并得到:
<a href="/proj/undefined/images/photo.jpg">photo.jpg</a>
Run Code Online (Sandbox Code Playgroud)
如果我加载显示所有结果的页面一切正常,但是如果我使用分页,只有第一页结果将具有rowObject [3]的正确值,而后续页面上的每个其他结果都不具有该rowObject值!
那么为什么rowObject包含关于最初加载到网格中的内容的正确数据,并且当网格结果的下一页出现时似乎丢失了该数据?
我在Firebug中看到的一件事我不明白...当页面最初加载时我得到:
console.log(rowObject);
["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""]
Run Code Online (Sandbox Code Playgroud)
在结果的下一页,我发现事情就像我预期的那样停止工作
console.log(rowObject);
Object { photo_id="18", site_id="133", more...}
Run Code Online (Sandbox Code Playgroud)
为什么要改变?第一个结果是json,为什么我现在得到这个对象?
Ole*_*leg 11
我想你使用loadonce:true选项.这是一个带来许多问题的选项(主要是理解问题).在jqGrid版本3.7中引入新的本地排序,分页和过滤(搜索)功能之前,本地和远程数据之间的分离是明确的.从jqGrid版本3.7开始,该loadonce:true选项允许您在第一次加载时拥有的远程数据与稍后的本地数据之间进行混合.在另一个答案中,已经讨论过密切问题.在加载过程结束时,如果loadonce:true使用选项datatype,则jqGrid将更改为'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'取决于你的服务器的数据),如果这是真的,你可以挽救你需要(从的3个列服务器返回的所有数据data在对象的外部阵列阵列).因此,您可以稍后在自定义格式化程序中访问数据.
更新:问题是在jqGrid的免费jqGrid fork中解决的.自定义格式(和cellattr,rowattr)包含仍然rowObject出于兼容性考虑的参数,但有存在附加 rowData在解析的数据被保存为命名属性的属性:
formatter: function (cellValue, options, rowObject) {
// either rowObject[1] or rowObject.site_id,
// but options.rowData.site_id works ALWAYS
}
Run Code Online (Sandbox Code Playgroud)
一个人可以使用
cellattr: function (rowid, cellValue, rowObject, cm, item) {
// either rowObject[1] or rowObject.site_id,
// but item.site_id works ALWAYS
}
Run Code Online (Sandbox Code Playgroud)
在cellattr.