You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Tabulator.js列中带搜索功能的多选组件实现问题求助

Tabulator.js列中带搜索功能的多选组件实现问题求助

我目前在使用Tabulator.js,想要创建一个带有搜索功能的多选列。我尝试用Select2库来实现,但遇到了一些问题。

以下是我使用的代码:

JavaScript 代码

const tabledata = [
    {
        id: 1,
        name: "Oli Bob",
        select2: ['two', 'three']
    },
    {
        id: 2,
        name: "Mary May",
        select2: ['two']
    },
    {
        id: 3,
        name: "Christine Lobowski",
        select2: ['two']
    },
    {
        id: 4,
        name: "Brendon Philips",
        select2: ['two']
    },
    {
        id: 5,
        name: "Margret Marmajuke",
    },
];

const list = [
    {
        id: 'one',
        text: 'one'
    },
    {
        id: 'two',
        text: 'two'
    },
    {
        id: 'three',
        text: 'three'
    }
];

const select2Editor = function (cell, onRendered, success, cancel, editorParams) {
    const editor = document.createElement("select");


    onRendered(function () {
        const select_2 = $(editor);

        select_2.select2({
            data: list,
            width: '100%',
            multiple: true,
            minimumInputLength: 0,
        })

        if (typeof cell.getValue() == 'object') {
            const selectedValuesIds = cell.getValue().map(val => list.find(x => x.text == val).id)
            select_2.val(selectedValuesIds).trigger('change')
        }

        select_2.on('select2:select select2:unselect', () => {
            const data = select_2.select2('data')
            const cellValue = data.map(el => el.text)
            success(cellValue)
        });


        // $(editor).on('blur', () => cancel)

        editor.focus()
    });

    return editor;
};

const table = new Tabulator("#table", {
    // debugEventsExternal: true,
    // debugEventsInternal: true,
    height: "500px",
    data: tabledata,
    rowHeight: 32,
    columns: [
        {
            title: "Name",
            field: "name",
            width: 150
        },
        {
            title: "Select2",
            field: "select2",
            width: 300,
            editor: select2Editor,
        },
    ],
});

HTML 代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<link href="https://unpkg.com/tabulator-tables@6.0.0/dist/css/tabulator.min.css" rel="stylesheet">
<script type="text/javascript" src="https://unpkg.com/tabulator-tables@6.0.0/dist/js/tabulator.min.js"></script>
<div id="table"></div>

使用这段代码时,我遇到了以下问题:

  • 要打开下拉列表,我得先点击单元格让编辑器出现,然后再点击一次才能打开列表,这感觉很麻烦也不直观。
  • 如果我在列表打开的时候点击其他不可编辑的单元格,焦点不会消失。我试过添加$(editor).on('blur', () => cancel),但这样列表根本打不开,因为当列表打开时,焦点会转移到Select2元素上,编辑器就关闭了。

我想知道有没有更简单的实现方式,比如不用额外的库?或者是不是我在当前用Select2的方法里漏掉了什么?希望能得到帮助和指导,谢谢!

备注:内容来源于stack exchange,提问作者Валентин Шмелев

火山引擎 最新活动