【问题标题】:jQuery Datatables rowGroup Collapse/ExpandjQuery 数据表 rowGroup 折叠/展开
【发布时间】:2018-03-06 23:31:27
【问题描述】:

我正在使用 jQuery Datatables,我想将行分组合并到表中。

我尝试通过添加行和单击事件处理程序来自行合并它,以展开/折叠与该行组相关的行。这依赖于切换行的可见性,这可行但很混乱。

我在这里遇到了大型表的问题,在滚动事件调用 drawCallback 之前,大多数行都不在 DOM 中,因此当我为行指定某个类以将它们与行组相关联时,每次滚动都会删除这些类的表。

Datatables 建议使用我目前已合并到我的表中的 rowGroup 扩展。 https://datatables.net/extensions/rowgroup/

此扩展程序没有展开或折叠组的选项,是否有人有操作此扩展程序以添加展开/折叠功能的经验?

我试图覆盖$.fn.dataTable.ext.search.push 以模拟不会绘制某些行的“过滤器”,我可以这样做。这里的问题是我无法决定在此方法中哪一行是 rowGroup 行来绘制,因此所有 rowGroup 行都被删除。

有没有人幸运地使用 rowGroup 扩展来扩展/折叠组?

【问题讨论】:

    标签: jquery datatables


    【解决方案1】:

    首先添加一个状态来跟踪折叠组:

     var collapsedGroups = {};
    

    接下来,将此添加到 Datatable 初始化以启用 rowGroup 插件。它通过检查collapapsedGroups 然后这个信息来隐藏或显示行来工作。它还添加了一个 css-class 来指示它是否已折叠:

     {
        rowGroup: {
            // Uses the 'row group' plugin
            dataSrc: 'product.category',
            startRender: function (rows, group) {
                var collapsed = !!collapsedGroups[group];
    
                rows.nodes().each(function (r) {
                    r.style.display = collapsed ? 'none' : '';
                });    
    
                // Add category name to the <tr>. NOTE: Hardcoded colspan
                return $('<tr/>')
                    .append('<td colspan="8">' + group + ' (' + rows.count() + ')</td>')
                    .attr('data-name', group)
                    .toggleClass('collapsed', collapsed);
            }
      }
    

    最后,添加一个用于单击行以折叠/展开行的处理程序。这会导致重新绘制表格,进而调用上面的startRender

       $tbody.on('click', 'tr.group-start', function () {
            var name = $(this).data('name');
            collapsedGroups[name] = !collapsedGroups[name];
            table.draw();
        });
    

    Here 是一个工作示例。

    【讨论】:

    • 非常好!稍作改动,将false 添加到table.draw(),否则,例如,如果您在第三页展开/折叠组,draw() 会将您返回到第一页。这是任何想要看到它的人的实现:live.datatables.net/cecosoru/1/edit
    • 请注意,通过引用 rows.columns()[0].length 可以消除对 colspan 的硬编码,例如:.append('&lt;td colspan="'+rows.columns()[0].length+'"&gt;' + group + ' (' + rows.count() + ')&lt;/td&gt;')
    • 我已经尝试了好几个小时来完成这项工作!!,我看到了 colin 的现场示例,试图复制,我就是不能,不知道为什么,但是不能...> 任何指南?跨度>
    • 折叠似乎只适用于第一级和最后一级的行分组。添加第三级并单击中间行不会隐藏其下的行组
    • 有没有办法让它们在页面加载时折叠?我一直在尝试并试图弄清楚并且没有运气
    【解决方案2】:

    您还可以添加一个切换图标来指示折叠状态(使用字体真棒):

    startRender: function (rows, group) {
        var collapsed = !!collapsedGroups[group];
    
        rows.nodes().each(function (r) {
            r.style.display = collapsed ? 'none' : '';
        });
    
        var toggleClass = collapsed ? 'fa-plus-square' : 'fa-minus-square';
    
        // Add group name to <tr>
        return $('<tr/>')
            .append('<td colspan="' + rows.columns()[0].length +'">' + '<span class="fa fa-fw ' + toggleClass + ' toggler"/> ' + group + ' (' + rows.count() + ')</td>')
            .attr('data-name', group)
            .toggleClass('collapsed', collapsed);
    },
    

    【讨论】:

    • 这非常有用。谢谢。
    • 如何一起折叠或展开?
    【解决方案3】:

    我找到了自己的答案,所以如果其他人将来对此有问题,我想分享它。

    使用以下代码实现行分组,其中 index 是您要分组的列索引:

    var dataSrc = g_oTable.columns(index).dataSrc();
    
    g_oTable.order([index, "asc"]).draw();
    g_oTable.order.fixed({
        pre: [ index, 'asc' ]
    }).draw();
    
    g_oTable.rowGroup().dataSrc(dataSrc[0]);
    g_oTable.rowGroup().enable().draw();
    
    $('.group').each(function(i, obj) {
        $(obj).nextUntil('tr.group').each(function(i) {
            $(this).toggle();
        });
    });
    g_oTable.draw();
    

    然后将点击事件处理程序添加到您的行组:

    $( document ).on("click", "tr.group", function(){
        $(this).nextUntil('tr.group').toggle();
    });
    

    【讨论】:

    • 这个解决方案虽然看起来简洁,但也存在一些问题,应该不会被接受。特别是,当显示的结果条目的数量发生变化并且最后显示的组被展开并仅显示结果的子集时,该行为是意外的。 Martin Wickman 提供的上述解决方案没有这个弱点并且有优点。使用 css 类进行切换的一个好处是很容易设置样式以显示通常的 +/- 用于展开/折叠。硬编码的 colspan 价格不菲,稍微想一想大概可以淘汰掉。
    【解决方案4】:

    我的快速而肮脏的解决方案是这样的......

    $('.group').click(function() {
        //$(this+" .group_date .date_arrow").addClass("rotateSVG");
        var nextItem = $(this).next('tr');
        while(nextItem.attr('class') != 'group') {
            nextItem.fadeToggle();
            if(nextItem.next('tr').length == 0) {
                break;
            }
            nextItem = nextItem.next('tr');
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 2018-01-25
      • 2020-05-10
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2013-05-31
      相关资源
      最近更新 更多