【问题标题】:jqGrid - rowObject inconsistencies?jqGrid - rowObject 不一致?
【发布时间】:2010-12-20 00:28:04
【问题描述】:

带有 jqgrid rowObject 的结果的第一页返回预期的数据,但随后返回的结果页的数据不完整。为什么?

结果首页: rowObject[3] 将等于“2”

结果的后续页面: rowObject[3] 将等于“未定义”,返回结果的第一页现在也将等于“未定义”。

更多细节和一些代码:

使用 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 呢?

【问题讨论】:

    标签: javascript jquery jqgrid


    【解决方案1】:

    我想你使用loadonce:true 选项。这是一个带来许多问题(主要是理解问题)的选项。在 jqGrid 3.7 版本中引入新的本地排序、分页和过滤(搜索)功能之前,本地和远程数据之间的分离已经很清楚了。从 jqGrid 3.7 版开始,loadonce:true 选项允许您在第一次加载时拥有的远程数据和稍后拥有的本地数据之间进行混合。在another answer 中已经讨论了关闭的问题。在加载过程结束时,如果使用loadonce:true 选项,jqGrid 的datatype 将更改为'local'。在那之后,很多事情都不同了。

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

    $("#list").jqGrid('getGridParam','data')可以看到整个本地数据,返回所有本地rowObject的数组。

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

    已更新:问题已在 jqGrid 的 free jqGrid fork 中解决。出于兼容性原因,自定义格式化程序(以及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.

    【讨论】:

    • @AshishJain:不客气!我很高兴这个 3 岁以上的答案仍然是实际的并且可以提供帮助。
    • @Oleg 我有同样的问题。我是否定义 loadonce: true 与否都没关系。一旦我进入第二页,id就变得未定义。当我访问 $("#list").jqGrid('getGridParam','data') 我不再有任何 id (包括第一页的)。我的问题是:就像你建议的那样,当我定义一个外部对象时它确实有效,(我感谢你的解决方案)但它不是一个“解决方法”吗?
    • @LuisGouveia:抱歉,但最好打开新问题,发布您使用的代码并详细描述问题。 了解您使用的 jqGrid 的哪个分支以及哪个版本非常重要。非常重要的是(自定义格式化程序,rowattrcellettr)您对rowObject 有问题。例如,您可以从 GitHub 获取最新版本的 the free grid - 这是我的 fork。您可以直接包含URL
    • @LuisGouveia:新版本的免费 jqGrid 扩展了 option 参数和 rowData 参数(另外还有单独的 rowData 参数!!!)。 option.rowData 应始终具有 named 属性事件,以防读取 repeatitems: true 格式的数据。
    • @Oleg,谢谢。我刚刚在这里发布了我的问题:stackoverflow.com/questions/30171728/…
    猜你喜欢
    • 2014-08-14
    • 2016-06-18
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多