【问题标题】:jQGrid subgrid with Single JSON generated by serverjQGrid 子网格与服务器生成的单个 JSON
【发布时间】:2013-01-11 16:01:52
【问题描述】:

我试图使用 jQGrid 构建一个子网格来显示父子关系。我关注经理和员工的关系。 我正在服务器上构建一个 JSON,这就是它的外观

{"total":1,"page":1,"records":20,
"rows":[{"id":"Mgr 001","EmpId":"Mgr 001","Manager Name":"Murali","Dept":"D1"
 ,"Employees":[{"EmpId":"Emp 100","Name":"Alex","Dept":"Infrastucture"}]}]

问题是当我点击展开时,我从 本地存储的employeeLocalJSON 变量并分配集合 到子网格。但它没有显示在子网格中。我不知道为什么会这样 所以。我想从服务器加载 json 并显示我应该使用的子网格 一样,所以我把那个存储在局部变量employeeLocalJSON中。

我关注了jqgrid subgrids from a single nested json

jqGrid Subgrid with "local" Data

JqGrid with subgrid and single XML file as input

这是我的 jQGrid 代码

$(function() {

var employeeLocalJSON;
jQuery("#list").jqGrid({
    //start
    url: '/Employee/Search',
    datatype: "json",
    postData: {
        searchModel: function () {
            var result = {}, i, item,
             formInfo = $('#search-form').serializeArray(),
             l = formInfo.length;
            for (i = 0; i < l; i++) {
                item = formInfo[i];
                result[item.name] = item.value;
            }
            return JSON.stringify(result);
        }
    },
    mtype: "POST",
    colNames: ['id', 'EmpId', 'Manager Name', 'Dept'],
    colModel: [
    { name: 'id', index: 'id', hidden: true, width: 1, align: 'left', key: true },
    { name: 'EmpId', index: 'EmpId', search: true, width: 260, align: 'left' },
    { name: 'ManagerName', index: 'ManagerName', search: false, width: 110, align: 'left' },
    { name: 'Dept', index: 'Dept', search: true, width: 54, align: 'left' }],
    pager: $("#pager"),
    rowNum: 20,
    rowList: [5, 10, 20, 50],
    sortname: 'EmpId',
    sortorder: "asc",
    viewrecords: true,
    loadonce: true,
    sortable: true,
    jsonReader: {
        repeatitems: false
    },
    loadComplete: function (data) {
        if (data.rows) {
            employeeLocalJSON = data.rows; // save original JSON data
        }
    },
    caption: 'Employee Manager Detail',
    subGrid: true,
    subGridOptions: {
        "plusicon": "ui-icon-triangle-1-e",
        "minusicon": "ui-icon-triangle-1-s",
        "openicon": "ui-icon-arrowreturn-1-e",
        "reloadOnExpand": false,
        "selectOnExpand": true
    },
    subGridRowExpanded: function (grid_id, row_id) {
        //            //start of subgrid row expanded
        var subgrid_table_id, pager_id;
        subgrid_table_id = grid_id + "_tone";
        pager_id = "pone_" + subgrid_table_id;
        $("#" + grid_id).html("<table id='" + subgrid_table_id + "' class='scroll' style='width:100%'></table><div id='" + pager_id + "' class='scroll'></div>");
        var indexes = $(this).jqGrid('getGridParam', '_index');

        var empList = employeeLocalJSON[indexes[row_id]].Employees;

        $("#" + subgrid_table_id).jqGrid({
            datatype: 'local',
            data: empList,
            colNames: ['EmpId', 'Name', 'Dept'],
            colModel: [
                        { name: 'EmpId', width: 170 },
                        { name: 'Name', width: 110 },
                        { name: 'Dept', width: 60 }
                       ],
            sortname: 'EmpId',
            viewrecords: true,
            sortorder: "asc",
            width: 960
        });
    }

    //end
});
//                         });
jQuery("#list").jqGrid('navGrid', '#pager', { add: false, edit: false, del: false });
});

如何实现从单个 JSON 加载子网格?我的代码可能有什么问题?我无法看到子网格,即使我绑定了数据

【问题讨论】:

    标签: jquery jquery-ui jqgrid


    【解决方案1】:

    您遇到的第一个重要问题是id 值中空格的使用(请参阅您的数据中的"id":"Mgr 001")。我可以建议你两个替代方案来解决这个问题。第一个是更改生成 id 值的算法。例如,如果可能,您可以从 id 中删除所有空格,或者将 " " 替换为任何其他字符。另一种选择是更改 jqGrid 代码的the line

    return String(sid).replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g,"\\$&");
    

    return String(sid).replace(/[!"#$%&'()* +,.\/:;<=>?@\[\\\]\^`{|}~]/g,"\\$&");
    

    (在 jqGrid 编码的字符列表中添加空格)。

    要在一个响应中发布子网格信息以及主网格数据,我建议您使用 JSON 的userdata 部分,稍后将作为"userData" 访问(大小写很重要!!! ) jqGrid 的参数。如果您不能在服务器端执行此操作,您可以在beforeProcessing 回调中对服务器响应进行相应的转换。对应的代码示例见the answer

    更新:我再次提醒托尼(参见here)关于在id 中转义空格的建议。刚才(请参阅here)更改已包含在 jqGrid 的主代码中。所以在下一个版本(比当前的 4.4.3 更高)中,jqGrid 将使用带有空格的 id。

    【讨论】:

    • 这很完美!我发现 jQuery("#" + subgrid_table_id) 是空的,因为 id 中有空格。虽然我使用 4.4.1 的缩小版,但我决定删除服务器端代码中的空格。如果我们将这个 ID 空间问题作为原始源代码中的修复程序,这可能会有所帮助。这只是一个想法,不确定影响/破坏现有代码
    • @Murali:不客气!我建议 Tony Tomov 在转义字符列表中包含空格(请参阅here),但 jqGrid 的代码中仍未包含此修复程序。或许我应该再提醒一次托尼这个建议。在过去的 10 天里,您是第三个遇到子网格和包含空格的 id 问题的人。顺便说一句,我看到您找到了解决将表单数据发布到控制器的问题的解决方法。不是吗?
    • 我在删除“loadonce:true”时遇到了另一个问题。我删除了它以进行服务器端分页和排序。但如果我删除,这一行 var indices = $(this).jqGrid('getGridParam', '_index');在 subGridRowExpanded 函数中,它没有给我数据。知道为什么会这样吗?
    • @Murali:内部参数_indexdata 将由jqGrid 填充,仅用于本地数据类型loadonce: true。因此,您必须自己将自定义数据(jqGrid 的标准 JSON 输入的扩展)保存在某个地方。例如,我建议您在我的回答中使用userdata 处理此案。或者,您可以从您当前使用的employeeLocalJSON 获取所需的数据。
    • 我使用了另一种方式循环遍历employeeLocalJSON和row_id并成功了。一切正常。感谢您在百忙之中抽出宝贵时间。
    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多