javascript - jqGrid - rowObject 不一致?

标签 javascript jquery jqgrid

带有 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>';

这给了我一个像这样的 url:

<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 那么为什么我现在得到这个对象?

最佳答案

我想你使用 loadonce:true选项。这是一个来自选项的问题,带来很多问题(主要是理解问题)。在 jqGrid 3.7 版本引入新的本地排序、分页和过滤(搜索)功能之前,本地和远程数据之间的分离很清楚。从 jqGrid 版本 3.7 开始 loadonce:true选项允许您在第一次加载时拥有的远程数据和稍后拥有的本地数据之间进行混合。在 another answer关闭问题已经讨论过了。在加载过程结束时出现 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' 取决于您的服务器数据)如果为真,您可以将所需的服务器返回的所有数据(来自 data 数组的第 3 列)保存在对象的外部数组中。因此,稍后您将能够在自定义格式化程序中访问数据。

已更新:问题已在 free jqGrid 中解决jqGrid 的分支。自定义格式化程序(和 cellattrrowattr )仍然包含 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 .

关于javascript - jqGrid - rowObject 不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4485970/

相关文章:

javascript - 全日历刷新/重新定义所有事件

jquery - eyecon 颜色选择器在编辑表单上的 jqgrid (jqueryui) 对话框后面弹出

javascript - 如何在触发 ondblClickRow 事件时防止 onSelectRow 事件

javascript - 如何强制带有动态 AJAX 元素的页面完全加载

javascript - 如何将网页快照及其所有元素(css、js、图像等)保存到一个文件中

javascript - 如何使用 Jade 将 id 添加到下划线模板

javascript - 将 `enter` selectin 合并到 `update` selections

jquery - 如何在 jquery 中序列化文件类型输入

jquery - Bootstrap - 在导航栏中更改事件类

javascript - 在 JQGrid 中创建链接