【问题标题】:Tabulator - Add menu button to column header制表符 - 将菜单按钮添加到列标题
【发布时间】:2018-11-14 14:00:35
【问题描述】:

我对 JavaScript 相当陌生,目前正在学习如何使用 Tabulator(除了这个问题之外,它工作得很好)。

我想为每个列标题添加一个菜单按钮,然后打开一个下拉菜单。从此菜单中,用户应该能够选择“分组依据”,然后使用所选列将表格分组数据。

有问题的按钮是:

<div class="ui icon top left pointing dropdown button" id=dropdown>
    <i class="bars icon"></i>
    <div class="menu">
        <div class="header">Options</div>
        <div class="item">Test</div>
    </div>
</div>

看起来像这样:

这是我当前的 columnData:

var table = new Tabulator("#example-table",{ 
        data:tabledata,
        layout:"fitColumns",
        locale:true,
        movableColumns:true,
        resizableColumns:false,
        columns:[
        {title:"Name", field:"name", headerFilter:"input"},
        {title:"Age", field:"age", align:"right", sorter:"number", headerFilter:"number", /* bottomCalc:"sum" */},
        {title:"Favorite Color", field:"col", headerFilter:"input"},
        {title:"Date of Birth", field:"dob", sorter:"date", align:"center", headerFilter:"input", headerContext:function(e, column){
                table.setGroupBy(column.getField());
                e.preventDefault();
            },
        },
        {title:"Nationality", field:"nationality", headerFilter:"input", headerContext:function(e, column){
                table.setGroupBy(column.getField());
                e.preventDefault();
            },
        },
        ],
        langs:{
            "de-de":{
                "headerFilters":{
                    "default":"Spalte filtern...",
                }
            }
        },
});

【问题讨论】:

    标签: javascript semantic-ui tabulator


    【解决方案1】:

    更新

    从 Tabulator 4.7 开始,现在内置了使用新的 headerMenu 选项将标题菜单添加到列的功能:

    //define row context menu
    var headerMenu = [
        {
            label:"Hide Column",
            action:function(e, column){
                column.hide();
            }
        },
    ]
    
    //add header menu in column definition
    var table = new Tabulator("#example-table", {
        columns:[
            {title:"Name", field:"name", width:200, headerMenu:headerMenu}, //add menu to this column header
        ]
    });
    

    有关可用功能的完整详细信息,请查看Menu Documentation

    原答案

    你应该使用一个titleFormatter来做到这一点,试图从表格外部操作制表符里面的元素是非常危险的,因为制表符使用了一个可以替换的虚拟DOM元素恕不另行通知,导致与插件的任何绑定丢失。

    在同一页面上使用相同 ID 的多个元素也是不好的做法,上述解决方案就是这种情况。元素 ID 在页面上应该是唯一的

    在这种情况下,您的标题格式化程序将如下所示:

    var menuTitleFormatter = function(cell, formatterParams, onRendered){
    
        //build dropdown
        var dropdown =  document.createElement("div");
    
        dropdown.classList.add("dropdown");
        dropdown.classList.add("ui");
    
        dropdown.innerHTML = "<i class='bars icon'></i><div class='menu'><div class='header'>Options</div><div class='item' class='sort1'>Sort</div><div class='item' class='group1'>Group</div></div>";
    
        //create dropdown
        $(dropdown).dropdown();
    
        $('.group1', $(dropdown)).click(function(){
            //do something when the item is clicked
        });
    
    
        //set header title
        var title = document.createElement("span");
        title.innerHTML = cell.getValue();
    
        //add menu to title
        title.appendChild(dropdown);
    
    
        return title;
    }
    

    您可以将其应用到其定义中的列

    {title:"Name", field:"name", titleFormatter:menuTitleFormatter },
    

    【讨论】:

    • 感谢您的回复,奥利!我唯一需要更改的是 dropdown.innerHTML 字符串。您将项目的类别设置为“sort1”和“group1”,老实说,我无法以我的知识完成任何事情。所以我用 id='...' 替换了它,现在一切正常。
    • 非常感谢您的详尽解释。这个解决方案帮助我在标题单元格内的图标上触发点击事件。然而,它仍然触发了两个点击事件,一个是我定义的,一个是用于排序的。为了解决这个问题,我不得不在点击定义中使用event.stopPropagation() 方法。
    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多