【问题标题】:jqgrid open subgrid only if there is some datajqgrid 仅在有数据时才打开子网格
【发布时间】:2012-11-23 14:19:38
【问题描述】:

这是我的子网格的声明:

    subGrid : true,
    subgridtype: 'json',
    subGridUrl: 'manuf_subgr.php',
    subGridModel: [{    name  : ['Package','Sticker','Manufacturer'], 
                        width : [85,50,100],
                        params: ['Catalogue'] 
                    } 
    ],
    gridComplete: function() {
        var timeOut = 50;
        var rowIds = $("#schedule").getDataIDs();
        $.each(rowIds, function (index, rowId) {
            if(rowId.row_cnt != 0){
                setTimeout(function() {
                    $("#schedule").expandSubGridRow(rowId);
                }, timeOut);
                timeOut = timeOut + 200;
            }
        });
    }

我期望发生的是这一行 if(rowId.row_cnt != 0) 如果没有从 json 返回的数据,则阻止打开子网格......但无论如何,所有网格都是打开的......

有人可以帮助实施停止以打开空子网格吗?

完整代码:

jQuery("#schedule").jqGrid({
    url:'sched.php',
    datatype: "json",
    mtype:'GET',
    colNames:['Street_Date','Label','Catalogue', 'Artist', 'Title','UKDP','UPCEAN','format'],
    colModel:[
        {name:'Street_Date',index:'Street_Date desc, ID', sorttype:"date", formatter:'date', formatoptions: {newformat:'d/m/Y'}, width:75},
        {name:'label',index:'label', width:100,align:"center"},     
        {name:'Catalogue',index:'Catalogue', width:85},
        {name:'Artist',index:'Artist', width:120},
        {name:'Title',index:'Title', width:250},
        {name:'UKDP',index:'UKDP', width:35, align:"right", formatter:"number", sorttype:"float"},
        {name:'UPCEAN',index:'UPCEAN', width:120, align:"center"},      
        {name:'format',index:'format', width:70, sortable:false}
    ],
    height: "100%",
    rowNum:20,
    rowList:[10,20,30,50,100],
    sortname: 'id',
    viewrecords: true,
    sortorder: "desc",
    jsonReader : { 
        root: "rows", 
        page: "page", 
        total: "total", 
        records: "records", 
        repeatitems: true, 
        cell: "cell", 
        id: "id",
        userdata: "userdata", 
        subgrid: {root:"rows", repeatitems: true, cell:"cell" } 
    },
    pager: '#schedule_pager',
    caption:"Release Schedule",

    grouping:true,
    groupingView : {
        groupField : ['Street_Date']
    },


    subGrid : true,
    subgridtype: 'json',
    subGridUrl: 'manuf_subgr.php',
    subGridModel: [{    name  : ['Package','Sticker','Manufacturer'], 
                        width : [85,50,100],
                        params: ['Catalogue'] 
                    } 
    ],
    gridComplete: function() {
        var timeOut = 50;
        var rowIds = $("#schedule").getDataIDs();
        $.each(rowIds, function (index, rowId) {
            if(rowId.row_cnt != 0){
                setTimeout(function() {
                    $("#schedule").expandSubGridRow(rowId);
                }, timeOut);
                timeOut = timeOut + 200;
            }
        });
    },

    onSelectRow: function (rowId) {
        $("#schedule").jqGrid ('toggleSubGridRow', rowId);
    }
});

【问题讨论】:

  • 语法rowId.row_cnt 肯定是错误的,因为rowId 是一个字符串。你能包括更多的代码吗? row_cnt 是网格的某些列的名称吗?哪个datatype 有网格?等
  • @Oleg,著名的 jqgrid 专家 ;) 我希望你能看到这篇文章。有趣的是,我从 Tony 帖子的 jqgrid 论坛中获得了这种平静的代码,我在网上搜索并找不到任何关于 row_cnt 方法的信息。但它不会破坏脚本! - trirand.com/blog/?page_id=393/feature-request/… 但现在我意识到我采取了完全错误的方法......仍然找不到更好的......我的意思是 - 应该有一种方法来检查 json 是否返回子网格上的任何数据?
  • 在您引用的帖子中,在if (rowdata.row_cnt) == 0 的使用之前存在var rowdata = getDataIDs(rowid); 行。所以row_cnt 是列名。可能该列已隐藏。你应该更好地描述有哪些场景。您不能只分析任何通用 JSON 数据并决定是否可以更好地使用子网格显示数据。另一方面,如果您在主网格的 JSON 数据中提供相应的信息,则可以实现对 具有 子网格的项目的扩展。见the answer
  • 有很多不同的选项。例如,可以将子网格数据与主网格的数据一起加载The answer 使用datatype: local,但思路相同:一个数据源(演示中的myGridData)保存主网格和所有子网格的所有数据. another answer 中描述的问题对您来说可能非常重要。您尝试实现的expandOnLoad: true 选项在 jqGrid 中实现不正确。所以你必须用另一种方式来实现它。
  • @Oleg,我希望避免对 db 中的多个表进行一次大查询,因此对子网格有单独的查询......关于你以前的帖子 - 我已经阅读了它。但问题是我在加载完成后打开所有子网格......打开所有子网格看起来很奇怪,然后它们都消失了。查看我更新的代码

标签: jqgrid subgrid


【解决方案1】:

您在评论中写道您是新手,使用它是第二天。 jqGrid 相对复杂,您尝试实现的第一个示例在我看来对于新手来说太复杂了。您尝试使用数据库中的数据加载填充 jqGrid,并在一个网格中进行分组和子网格。

您尝试在演示中实现的内容可以通过使用subGridOptions 选项的expandOnLoad: true 属性来解决:

subGridOptions: {expandOnLoad: true}

您可以在the official demo 上看到伪装在“层次结构”/“加载时扩展所有行”下的功能。我在the answer 中描述了一个重要问题。问题很快就出现了:jqGrid 中使用的 Ajax 请求的内部实现在另一个未决(服务器尚未回答)正在工作时阻止(跳过)Ajax 请求(请参阅代码 here、@ 的位置处的 .grid.hDiv.loading子网格模块中的 987654324@ 和 hereherehere)。 expandOnLoad: true 和您当前的实现都不能保证新的 Ajax 请求将在前一个仍然没有响应的过程中启动。所以您不能打开所有子网格。您的主要问题是:“如何防止打开空子网格或如何隐藏它?”,我发现第二个(也是不太重要的)问题。即使您目前看到您的网站打开了所有子网格,也可能是从互联网更远的地方访问同一站点将仅在打开一个或一些子网格之后进行。

所以我认为您应该更改网页的设计(更改要在子网格中显示的内容)或更改实现,以便您使用子网格列表构建 队列应该打开并且您将打开下一个网格只有在上一个网格打开之后。

或者,您可以在主网格的响应中包含所有子网格的数据。在这种情况下,您应该使用subGridRowExpanded 回调将网格填充为subgrid as grid。您将在子网格中不使用captionpager 选项,您将获得与标准子网格相同的外观。此外,您将在选项方面拥有更大的灵活性。我个人更喜欢子网格作为网格。

【讨论】:

  • 嗨,谢谢您的广泛回答。正如您之前提到的,我尝试使用 expandOnLoad: true 没有成功 - 由于主要的待处理查询仍然存在,因此查询没有被执行。因此,我在 gridComplete 上扩展子研磨时有“超时”延迟,这工作正常。该网站仅供内部使用,所以我并不担心“远”查询真的......你建议要么在子网格上运行一个队列,要么在一个请求中全部完成 - 这仍然不能确保空子网格不会被建造。有没有办法检查 ajax 是否返回子网格的任何数据?
  • @Elen:我的意思是:您在对主网格 (url:'sched.php') 的响应中包含了返回行的 all 子网格的数据。例如,您可以使用userdata。加载主网格后,您可以打开所有子网格(如果相应行不包含空网格)。因为您已经本地拥有所有数据(例如在$("#schedule").jqGrid("getGridParam", "userData") 内部),您实际上可以按照我之前提到的the answer 中的相同方式执行此操作。
  • @Elen:请参阅here 以了解如何将userdata 放置在服务器响应中的详细信息。如果你之前没用过userdata,那很简单。服务器响应的userdata 属性的值可以是您喜欢的任何格式的任何对象。使用userdata 的唯一优点是附加数据将与其他网格关联保存,您可以像访问其他数据一样轻松访问数据。
  • 嗨奥列格,我想我明白这是最好的方法,但我需要进一步研究......我会让你知道
猜你喜欢
  • 2012-04-27
  • 2011-05-16
  • 2011-10-28
  • 2016-09-17
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
相关资源
最近更新 更多