【问题标题】:jqGrid server response - different format, but it works. Why?jqGrid 服务器响应 - 不同的格式,但它的工作原理。为什么?
【发布时间】:2014-10-31 04:40:19
【问题描述】:

我刚刚发现 jqGrid 要求服务器响应格式是这样的:

{ 
  "total": "xxx", 
  "page": "yyy", 
  "records": "zzz",
  "rows" : [
    {"id" :"1", "cell" :["cell11", "cell12", "cell13"]},
    {"id" :"2", "cell":["cell21", "cell22", "cell23"]},
      ...
  ]
}

我应该使用 json reader 来映射属性,以防我的服务器响应属性不是 jqGrid 默认值。

但我的服务器响应与该插件完全不同,但插件仍然有效。我们的 JSON 中没有“行”或“页面”属性。并且总记录正确显示。我的服务器响应示例:

[
    {"id":1,"price":3.99,"title":"Foo"},
    {"id":2,"price":3.99,"title":"Bar"},
    ...
]

怎么会?

非常感谢。

【问题讨论】:

    标签: jquery jqgrid


    【解决方案1】:

    这是绝对正确的问题!输入数据的第一种格式是支持最旧版本 jqGrid 的输入格式。为了能够读取第二种格式(项目数组),必须使用 jqGrid 的棘手且早期不为人知的jsonReader 功能,其中jsonReader 的属性将被定义为函数。可以使用以下jsonReader

    jsonReader: {
        repeatitems: false,
        root: function (obj) { return obj; },
        page: function () { return 1; },
        total: function () { return 1; },
        records: function (obj) { return obj.length; }
    }
    

    在引入loadonce: true 功能后,第二种输入格式(具有命名属性的项目数组)的使用变得更加普遍。第一种数据格式是指服务器端分页、排序和过滤/搜索数据。服务器应只返回一页数据,并使用total 参数通知jqGrid 页面总数。如果使用loadonce: true,服务器必须立即返回所有数据。如果响应包含total、page 和records 属性,这些属性将被忽略,jqGrid 根据返回的数据数组计算值。

    使用错误格式的输入数据或使用错误的jsonReader 属性与输入数据不对应是很多错误。我有想法修改 jqGrid 的代码以检测并修复基于输入数据格式的jsonReader 的明确错误选项。我将我的建议作为被排除的拉取请求和merged 发布到 jqGrid 的主代码。所以从版本 4.4.5 开始(见here)jsonReader 在大多数情况下都不能使用。由于该特性,jqGrid 可以读取两种输入格式,而无需指定任何额外的jsonReader 选项。

    【讨论】:

    • 感谢您的宝贵时间,@Oleg。但是让我看看我是否正确:不可能使用服务器端分页加上一系列项目?我们有数千条记录,因此对服务器数据进行分段是合理的。此外,我们无法将服务器响应更改为对 jqGrid 更友好的格式。
    • @darksoulsong:几乎一切皆有可能。您应该设置足够大的total 值,定义为jsonReader 中的函数。在这种情况下,寻呼机的“下一页”按钮将被启用,用户可以转到下一页。
    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 2012-07-01
    • 2021-06-15
    • 1970-01-01
    • 2015-09-01
    • 2016-06-28
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多