gpt4 book ai didi

javascript - 如何在 handsontable 的上下文菜单中添加具有默认项目的自定义项目

转载 作者:行者123 更新时间:2023-11-29 10:59:14 25 4
gpt4 key购买 nike

我尝试使用 handsontable 并想将自定义项添加到上下文菜单。

实现自定义菜单的教程很多,但是忽略了默认项。

所以我添加了所有项目的 key ,但其中一些不起作用。

我的设置如下。

var basicSettings = {
minRows: 1,
minCols: 1,
rowHeaders: false,
colHeaders: false,
hiddenColumns: true,
contextMenu: {
items: {
row_above: {},
row_below: {},
"hsep1": "---------",
col_left: {},
col_right: {},
"hsep2": "---------",
remove_row: {},
remove_col: {},
"hsep3": "---------",
undo: {},
redo: {},
"hsep4": "---------",
make_read_only: {},
"hsep5": "---------",
alignment: {},
"hsep6": "---------",
copy: {},
cut: {},
"paste": {
name: 'Paste',
callback: function (key, option) {
this.copyPaste.triggerPaste();
}
},
"hsep7": "---------",
mergeCells: {
name: "Merge"
},
"hsep8": "---------",
// Custom menu item to set color of cells
set_color: {
key: "color",
name: "Color",
"submenu": {
"items": [
{
key: "color:1",
"name": "Black",
callback: function(key, options) {
for (var i = options[0].start.row; i <= options[0].end.row; i ++){
for (var j = options[0].start.col; j <= options[0].end.col; j ++){
this.getCell(i, j).className = "color-black";
}
}
}
}, {
key: "color:2",
"name": "White",
callback: function(key, options) {
for (var i = options[0].start.row; i <= options[0].end.row; i ++){
for (var j = options[0].start.col; j <= options[0].end.col; j ++){
$(this.getCell(i, j)).removeClass("color-*").addClass("color-white");
}
}
this.render();
}
}, {
key: "color:3",
"name": "Red",
callback: function(key, options) {
for (var i = options[0].start.row; i <= options[0].end.row; i ++){
for (var j = options[0].start.col; j <= options[0].end.col; j ++){
this.getCell(i, j).style.backgroundColor = "red";
}
}
this.render();
}
}
]
}
}
}
},
manualRowResize: true,
manualColumnResize: true,
contextMenuCopyPaste: {
swfPath: '/bower_components/zeroclipboard/dist/ZeroClipboard.swf'
},
copyPaste: true,
mergeCells: true,
search: true,
stretchH: 'all',
autoColumnSize: {useHeaders: true},
autoRowSize: {syncLimit: 300},
width: 1000,
height: window.innerHeight - 100,
licenseKey: "xxxxx-xxxxx-xxxxx-xxxxx-xxxxx"
};

菜单看起来像这样。

Current Menu

问题一:

有什么方法可以在所有默认菜单项中添加自定义项吗?如果是这样,我不需要回答问题 3 和问题 4。

问题2:

让我问这个问题的最重要的部分是自定义菜单,即“set_color”。单击“黑色”或“红色”后,它变成那种颜色,但在我更改单元格的值后,它又变回原来的颜色。如何防止单元格恢复其背景颜色?

问题 3:

除了启用所有功能外,我还想要其他自定义项。但是我找不到“合并”项目的正确 key 。当前的“合并”功能工作起来很奇怪。如何使功能正常运行?

问题4:

我试过了 https://github.com/handsontable/handsontable/issues/2853实现粘贴功能,但我看到了这个错误。

未捕获的类型错误:无法读取未定义的属性“triggerPaste”

请帮助我了解那些可上手的用法。提前致谢。

最佳答案

对于问题 1:

Is there any way to add custom item with all the default menu items? If so, I don't need answers to Question 3 and Question 4.

  • 初始化 Handsontable 并将 contextMenu 设置为 true。示例:

      let
    example3 = document.getElementById('example3'),
    settings3,
    hot3;

    settings3 = {
    data: [...],
    rowHeaders: true,
    colHeaders: true,
    contextMenu: true // set to `true`..
    };
    hot3 = new Handsontable(example3, settings3);

  • 然后像这样更新 contextMenu 设置:

      let cm = hot3.getPlugin('ContextMenu');
    hot3.updateSettings({
    contextMenu: {
    // Clone the pre-defined items and add your custom items.
    items: Object.assign({}, cm.itemsFactory.predefinedItems, {
    'hsep1': '---------',
    'set_color': {
    key: 'color',
    name: 'Color',
    submenu: {
    items: [{
    key: 'color:red',
    name: 'Red',
    callback: setCellColor
    }, {
    key: 'color:blue',
    name: 'Blue',
    callback: setCellColor
    }]
    }
    }
    })
    }
    });

  • 对于问题2:

    The most important part that let me ask this question is custom menu, that is "set_color". After clicking "Black" or "Red", it turns into that color, but after I change value of a cell, it turns back. How can I prevent the cells from turning their background color back?

    我不确定如何防止;但是,这里有一种方法可以恢复相应单元格的颜色(或任何其他自定义/元数据..)。

      // This is my callback for the 'set_color' context menu items.
    // Sample `key`: 'color:red'
    function setCellColor(key, opt) {
    let color = key.substring(6);
    for (let i = opt[0].start.row; i <= opt[0].end.row; i++) {
    for (let j = opt[0].start.col; j <= opt[0].end.col; j++) {
    this.getCell(i, j).style.color = color;
    this.setCellMeta(i, j, 'color', color); // Save the color
    }
    }
    }

    // Listen to the `beforeRenderer` event, and restore the cell's color
    // before the "renderer" starting rendering the cell
    Handsontable.hooks.add('beforeRenderer', function(td, r, c, p, pv, cp){
    if (cp.color) {
    td.style.color = cp.color;
    }
    }, hot3);

    演示

    在此处尝试完整示例:http://jsfiddle.net/y9j3m29c/1/ , 这是基于 https://docs.handsontable.com/3.0.0/demo-context-menu.html#page-custom

    对于粘贴功能:

  • 加载SheetClip():

    <script src="https://unpkg.com/sheetclip"></script>

  • 添加必要的变量:

    let clipboardCache = '';
    const sheetclip = new SheetClip();

  • 添加必要的回调:

      settings3 = {
    ...
    afterCopy: function(changes){
    clipboardCache = sheetclip.stringify(changes);
    },
    afterCut: function(changes){
    clipboardCache = sheetclip.stringify(changes);
    },
    afterPaste: function(changes){
    clipboardCache = sheetclip.stringify(changes);
    }
    };

  • 添加上下文菜单项:

      let cm = hot3.getPlugin('ContextMenu');
    hot3.updateSettings({
    contextMenu: {
    // Clone the pre-defined items and add your custom items.
    items: Object.assign({}, cm.itemsFactory.predefinedItems, {
    ...
    'paste': {
    name: 'Paste',
    disabled: function(){
    return clipboardCache.length === 0;
    },
    callback: function(){
    var plugin = this.getPlugin('copyPaste');

    this.listen();
    plugin.paste(clipboardCache);
    }
    }
    })
    }
    });

  • 有关 https://docs.handsontable.com/3.0.0/demo-copy-paste.html#paste-in-context-menu 的更多详细信息和演示 http://jsfiddle.net/y9j3m29c/2/ — 或 http://jsfiddle.net/y9j3m29c/4/它带有“清除剪贴板”功能。

    关于javascript - 如何在 handsontable 的上下文菜单中添加具有默认项目的自定义项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50538365/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com