Javascript jqGrid-行对象不一致?

Javascript jqGrid-行对象不一致?,javascript,jquery,jqgrid,Javascript,Jquery,Jqgrid,带有jqgrid rowObject的结果的第一页返回预期数据,但随后的结果页返回不完整的数据。为什么? 结果的第一页: rowObject[3]将等于“2” 结果的后续页面: rowObject[3]将等于“undefined”,返回结果的第一页也将等于“undefined” 更多详细信息和一些代码: 使用jqGrid,如果要实现自定义格式化程序,可以使用一个名为rowObject的参数,该参数包含行数据。例如,rowObject的一行可以是: ["18", "133", "Betelgues

带有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>';
在下一页的结果中,我看到事情按照我的预期停止了

console.log(rowObject);
Object { photo_id="18", site_id="133", more...} 

为什么要改变?第一个结果是json,那么为什么我现在得到这个对象呢?

我想您应该使用
loadonce:true
选项。这是一个带来许多问题(主要是理解问题)的选项。在jqGrid的3.7版中引入新的本地排序、分页和过滤(搜索)功能之前,本地数据和远程数据之间的分离是明确的。从jqGrid版本3.7开始,
loadonce:true
选项允许您在第一次加载时使用的远程数据和以后使用的本地数据之间进行混合。最后,这个问题已经讨论过了。在加载过程结束时,如果使用
loadonce:true
选项,jqGrid的
数据类型将更改为
“本地”
。在那之后,很多事情都不一样了

我建议您使用一种快速有效的方法来确定是否应访问每个整数索引
rowObject[3]
(如果您访问远程数据)或每个命名属性
rowObject.projectId

您可以使用
$(“#list”).jqGrid('getGridParam','data')
查看整个本地数据,它返回所有本地
行对象的数组

如果需要访问的数据(
rowObject[3]
未保存在jqGrid的某列中,则您将无法在
rowObject
中查看信息。在这种情况下,您可以为数据使用一个额外的隐藏列,或者在任何外部对象中的
loadComplete:function(data){…}
中的第一次加载时保存数据。您可以测试
$(“#list”).jqGrid('getGridParam','datatype')
'json'
(或
'xml'
取决于您的服务器数据),如果是真的,您可以将从服务器返回的所有数据(从
数据
数组的第3列)保存在对象的外部数组中。因此,您以后可以在自定义格式化程序中访问数据

更新:问题在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
}
可以使用

cellattr: function (rowid, cellValue, rowObject, cm, item) {
    // either rowObject[1] or rowObject.site_id,
    // but item.site_id works ALWAYS
}

cellatr

@AshishJain:不客气!我很高兴这个答案,已经3岁多了,仍然是真实的,可以帮助我。@Oleg我也有同样的问题。我是否定义loadonce并不重要:正确与否。我一进入第二页,id就没有定义了。当我访问$(“#list”).jqGrid('getGridParam','data')时,我不再有任何id(包括第一页的id)。我的问题是:当我像你建议的那样定义一个外部对象时,它确实起作用,(我感谢你的解决方案),但这不是一个“解决办法”吗?@LuisGouveia:对不起,但是如果你打开一个新的问题,发布你使用的代码并详细描述这个问题,会更好。了解您使用的jqGrid的哪个分支和版本很重要。当(自定义格式化程序,
rowattr
cellettr
)遇到
rowObject
问题时,这一点非常重要。例如,您可以从GitHub获得最新版本-it's my fork。您可以直接包含。@LuisGouveia:FreeJQGrid的新版本扩展了
选项
参数和
行数据
参数(除了分隔
行数据
参数!!!)。
选项.rowData
在以
repeatitems:true
格式读取数据时,应始终具有命名属性事件。@Oleg,谢谢。我刚刚在这里发布了我的问题:
console.log(rowObject);
Object { photo_id="18", site_id="133", more...} 
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
}