【问题标题】:jqGrid: How to load only rows that an attribute is set to truejqGrid:如何仅加载属性设置为true的行
【发布时间】:2017-09-20 12:35:39
【问题描述】:

我有一个 JSON 对象,如下所示:

{
  "rows": [
  {
    "id":1,
    "name": "Peter",
    "hasData": true,
  },
  {
    "id":2,
    "name": "Tom",
    "hasData": false,
  }]
}

我希望 jqGrid 只加载有数据的行,这意味着当 "hasData" == true 时。

我首先想知道这样做的最佳方法是什么,其次想知道如何去做。

更新: 我尝试了以下方法:

gridComplete: function(){
  var rowObjects = this.p.data;
    for(var i = 0; i<rowObjects.length;i++){
      if(rowObjects[i].hasData == false){
        $(this).jqGrid('delRowData',rowObjects[i].id);
      }
    }
  },

但问题是当我转到下一页时,所有数据都是从 JSON 中新加载的。

【问题讨论】:

    标签: jqgrid


    【解决方案1】:

    我假设您使用datatype: "json" 结合loadonce: true 选项从服务器加载数据。如果您使用 jqGrid 的free jqGrid fork,则解决方案非常简单。免费的 jqGrid 允许对从服务器返回的数据进行排序和过滤,在显示第一页数据之前。需要添加forceClientSorting: true 以强制通过jqGrid 和postData.filters 应用您需要的过滤器的操作,以及应用过滤器的选项search: true

    $("#grid").jqGrid({
        ...
        datatype: "json",
        postData: {
            // the filters property is the filter, which need be applied
            // to the data loaded from the server
            filters: JSON.stringify({
                groupOp: "AND",
                groups: [],
                rules: [{field: "hasData", op: "eq", data: "true"}]
            })
        },
        loadonce: true,
        forceClientSorting: true,
        search: true,
        // to be able to use "hasData" property in the filter one has to
        // include "hasData" column in colModel or in additionalProperties
        additionalProperties: ["hasData"],
        ...
    });
    

    查看演示 https://jsfiddle.net/OlegKi/epcz4ptq/,它演示了它。该演示使用 JSFiddle 的Echo service 来模拟服务器响应。

    【讨论】:

    • 由于某种原因,“hasData”属性不想读取包含值。应用过滤器时,它只是飞过该值,就好像它不存在一样。另外至少对我来说,初始化 filters.rules 会给我一个 TypeError,我很容易通过将它放在 filters.groups 中解决这个问题
    • @lynxidngo:您目前使用哪个版本的 jqGrid 以及来自哪个分支的 jqGrid?你的代码在哪里,这会导致问题吗?抱歉,我在回答中发布了演示 jsfiddle.net/OlegKi/epcz4ptq。演示是否正常工作?如果你写的是你有问题,那么你可以用你的代码修改我的演示,保存并发布修改版本的 URL。
    • 我正在使用“jqGrid 5.2.1”。该演示工作正常。我不知道粘贴我的代码有多大意义,因为它大约有 800 行长。
    • @lynxidngo:我写道,我的回答展示了在使用我开发的 free jqGrid fork of jqGrid 的情况下如何实现您的要求。我描述的这个特性只存在于免费的 jqGrid 中。 Guriddo jqGrid JS 5.2.1 是 commercial 版本,价格为here。您可以选择使用哪个版本。我要求您发布代码作为对您之前评论的回应,您在其中写了一些错误。
    • 我发现了我的错误。问题是我从服务器接收的 JSON 对象。其中一个属性与其他属性交互的方式是,它之后的所有内容都将被忽略。
    【解决方案2】:

    我可以向您推荐另一种解决方案(如果您使用 Guriddo jqGrid),它可以与任何数据类型和任何设置一起使用。这个想法是使用 beforeProcessing 事件来过滤所需的数据。

    为此,我们假设数据与您描述的一样。代码如下:

    $("#grid").jqGrid({
    ...
            beforeProcessing : function (data, st, xhr) {
    
                var test= data.rows.filter(function (row) {
                    if(row.hasData == true ) { // true is not needed but for demo
                        return true;
                    } else {
                        return false;
                    }
                });
                data.rows = test;
                return true;
            }
    ...
    });
    

    我想脚本可以在免费的 jqGrid 中运行,以防你使用它们

    【讨论】:

    • 试用了您的方法,对首页效果很好。但是(仅供参考,json对象只是一个例子,因为真正的json包含超过1000个对象)当转到下一页时,它会卡在加载中并且从不处理加载。
    • 能否请您从服务器发布您的完整数据?您可以使用 console.log 查看来自服务器的数据以及如何处理。
    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多