【问题标题】:Load local JSON data in jQgrid without AddJsonRows在没有 AddJsonRows 的 jQgrid 中加载本地 JSON 数据
【发布时间】:2011-07-26 14:07:59
【问题描述】:

我正在使用 addJsonRows 方法将本地数据添加到 jQgrid。由于此方法禁用排序,我需要另一种解决方案。一个限制:我无法设置 url 并从服务器获取数据,因为数据是通过另一个组件传递的。

下面的 sn-p 启发了这个案例。注释行显示了限制,我通过定义一个局部变量来替换它以拥有一个测试用例。

<script type="text/javascript" language="javascript">
    function loadPackageGrid() {
    // Get package grid data from hidden input.
    // var data = eval("("+$("#qsmId").find(".qsm-data-packages").first().val()+")");
        var data =  {
            "page": "1",
            "records": "2",
            "rows": [
                { "id": "83123a", "PackageCode": "83123a" },
                { "id": "83566a", "PackageCode": "83566a" }
            ]
        };

        $("#packages")[0].addJSONData(data);
    };

    $(document).ready(function() {
        $("#packages").jqGrid({
            colModel: [
                { name: 'PackageCode', index: 'PackageCode', width: "110" },
                { name: 'Name', index: 'Name', width: "300" }
            ],
            pager: $('#packagePager'),
            datatype: "local",
            rowNum: 10000,
            viewrecords: true,
            caption: "Packages",
            height: 150,
            pgbuttons: false,
            loadonce: true
        });
    });
</script>

我想知道如何以其他(更好的)方式来保持排序功能。 我尝试了一些数据选项,但没有结果。

【问题讨论】:

    标签: jqgrid


    【解决方案1】:

    我想同样的问题对其他人来说也很有趣。所以我为这个问题 +1。

    您至少可以通过两种方式解决问题。第一个您可以使用datatype: "jsonstring"datastr: data。如果您需要添加额外的参数jsonReader: { repeatitems: false }

    第二种方法是使用datatype: "local"data: data.rows。在这种情况下,localReader 将用于从data.rows 数组中读取数据。默认localReader可以读取数据。

    对应的demo是herehere

    我对您的数据进行了一些修改:填充了“名称”列,并在输入数据中包含了第三项。

    现在您可以使用本地分页、排序和过滤/搜索数据。我包含了更多代码来演示这些功能。您可以在下面找到演示中的代码:

    $(document).ready(function () {
        'use strict';
        var data = {
                "page": "1",
                "records": "3",
                "rows": [
                    { "id": "83123a", Name: "Name 1", "PackageCode": "83123a" },
                    { "id": "83432a", Name: "Name 3", "PackageCode": "83432a" },
                    { "id": "83566a", Name: "Name 2", "PackageCode": "83566a" }
                ]
            },
            grid = $("#packages");
    
        grid.jqGrid({
            colModel: [
                { name: 'PackageCode', index: 'PackageCode', width: "110" },
                { name: 'Name', index: 'Name', width: "300" }
            ],
            pager: '#packagePager',
            datatype: "jsonstring",
            datastr: data,
            jsonReader: { repeatitems: false },
            rowNum: 2,
            viewrecords: true,
            caption: "Packages",
            height: "auto",
            ignoreCase: true
        });
        grid.jqGrid('navGrid', '#packagePager',
            { add: false, edit: false, del: false }, {}, {}, {},
            { multipleSearch: true, multipleGroup: true });
        grid.jqGrid('filterToolbar', { defaultSearch: 'cn', stringResult: true });
    });
    

    更新:我决定添加更多关于datatype: "jsonstring"datatype: "local" 方案之间差异的详细信息,因为旧答案被许多读者阅读和投票。

    我建议稍微修改上面的代码以更好地显示差异。第一个代码使用datatype: "jsonstring"

    $(function () {
        "use strict";
        var data = [
                { id: "10", Name: "Name 1", PackageCode: "83123a", other: "x", subobject: { x: "a", y: "b", z: [1, 2, 3]} },
                { id: "20", Name: "Name 3", PackageCode: "83432a", other: "y", subobject: { x: "c", y: "d", z: [4, 5, 6]} },
                { id: "30", Name: "Name 2", PackageCode: "83566a", other: "z", subobject: { x: "e", y: "f", z: [7, 8, 9]} }
            ],
            $grid = $("#packages");
    
        $grid.jqGrid({
            data: data,
            datatype: "local",
            colModel: [
                { name: "PackageCode", width: 110 },
                { name: "Name", width: 300 }
            ],
            pager: "#packagePager",
            rowNum: 2,
            rowList: [1, 2, 10],
            viewrecords: true,
            rownumbers: true,
            caption: "Packages",
            height: "auto",
            sortname: "Name",
            autoencode: true,
            gridview: true,
            ignoreCase: true,
            onSelectRow: function (rowid) {
                var rowData = $(this).jqGrid("getLocalRow", rowid), str = "", p;
                for (p in rowData) {
                    if (rowData.hasOwnProperty(p)) {
                        str += "propery \"" + p + "\" + have the value \"" + rowData[p] + "\n";
                    }
                }
                alert("all properties of selected row having id=\"" + rowid + "\":\n\n" + str);
            }
        });
        $grid.jqGrid("navGrid", "#packagePager",
            { add: false, edit: false, del: false }, {}, {}, {},
            { multipleSearch: true, multipleGroup: true });
        $grid.jqGrid("filterToolbar", { defaultSearch: "cn", stringResult: true });
    });
    

    它显示(见the demo

    人们可以像输入数据一样以相同的顺序查看未排序项。输入数据项将保存在内部参数data_index 中。在onSelectRow 中使用的getLocalRow 方法表明,内部data 的项目仅包含名称对应于某些jqGrid 列的name 属性的输入项目的属性。此外,将添加不需要的 _id_ 属性。

    另一边the next demo使用datatype: "local"显示排序数据,包含复杂对象的所有属性仍将保存在内部data中:

    上一个演示中使用的代码如下:

    $(function () {
        "use strict";
        var data = [
                { id: "10", Name: "Name 1", PackageCode: "83123a", other: "x", subobject: { x: "a", y: "b", z: [1, 2, 3]} },
                { id: "20", Name: "Name 3", PackageCode: "83432a", other: "y", subobject: { x: "c", y: "d", z: [4, 5, 6]} },
                { id: "30", Name: "Name 2", PackageCode: "83566a", other: "z", subobject: { x: "e", y: "f", z: [7, 8, 9]} }
            ],
            $grid = $("#packages");
    
        $grid.jqGrid({
            data: data,
            datatype: "local",
            colModel: [
                { name: "PackageCode", width: 110 },
                { name: "Name", width: 300 }
            ],
            pager: "#packagePager",
            rowNum: 2,
            rowList: [1, 2, 10],
            viewrecords: true,
            rownumbers: true,
            caption: "Packages",
            height: "auto",
            sortname: "Name",
            autoencode: true,
            gridview: true,
            ignoreCase: true,
            onSelectRow: function (rowid) {
                var rowData = $(this).jqGrid("getLocalRow", rowid), str = "", p;
                for (p in rowData) {
                    if (rowData.hasOwnProperty(p)) {
                        str += "propery \"" + p + "\" + have the value \"" + rowData[p] + "\"\n";
                    }
                }
                alert("all properties of selected row having id=\"" + rowid + "\":\n\n" + str);
            }
        });
        $grid.jqGrid("navGrid", "#packagePager",
            { add: false, edit: false, del: false }, {}, {}, {},
            { multipleSearch: true, multipleGroup: true });
        $grid.jqGrid("filterToolbar", { defaultSearch: "cn", stringResult: true });
    });
    

    所以我建议使用datatype: "local" 而不是datatype: "jsonstring"datatype: "jsonstring" 可能仅在某些非常特定的场景中具有一些优势。

    【讨论】:

    • 再次非常感谢您的回答!我注意到演示链接是相同的。但是我在没有第二个演示的情况下管理它,也许它对其他人有用。
    • 糟糕的答案,感谢@Brecht 的好问题。
    • 嗨,@Oleg,我有一个问题是我正在通过 json 检索数据并添加到 jqgrid。但是想在本地搜索,可以吗?
    • @ankit5607san:我不确定你为什么需要这种行为。如果我正确理解您的问题,您可以使用datatype: "json"loadonce: true。如果您需要立即从服务器加载所有数据,并且在第一次从服务器加载后datatype 将更改为"local"。所有下一个分页和排序/过滤都将在本地完成。为了能够刷新网格中的数据,您可以在beforeRefresh 中重置datatype:参见here
    • @Oleg 在这里,我们在单击一行时收到警报。我们可以在上面再放一个 jqgrid 吗?
    【解决方案2】:

    很好的建议,奥列格。

    在我的网络应用程序中,我预加载了一些如下所示的 JSON 数据:

        {
           WorkflowRuns: 
           [
               {
                  WorkflowRunID: 1000,
                  WorkflowRunName: "First record",
               },
               {
                  WorkflowRunID: 1001,
                  WorkflowRunName: "Second record",
               }
           ],
           UserInformation: 
           {
              Forename: "Mike",
              Surname: "Gledhill"
           }
    }
    

    下面是我创建 jqGrid 所需的代码,仅基于此 JSON 的 WorkflowRuns 部分:

    var JSONstring = '{ WorkflowRuns: [ { WorkflowRunID: 1000, .. etc .. } ]';
    
    $("#tblWorkflowRuns").jqGrid({
        datatype: "local",
        data: JSONstring.WorkflowRuns,
        localReader: {  
            id: "WorkflowRunID",
            repeatitems: false
        },
        ...
    });
    

    不过,这有点反复试验。

    例如,jqGrid 对我来说似乎忽略了datastr: JSONstring

    注意,对于本地数据,我需要使用localReader,而不是jsonReader,否则将无法正确设置行ID。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      相关资源
      最近更新 更多