如何合并原生的命令(Command)和自定义命令
本帖最后由 Joestar.Xu 于 2024-6-5 17:40 编辑在项目开发过程中,经常会碰到需要自己定义一个Command的来满足可以撤回等需求的情况。
细心的朋友可能会发现,我们在自定义Command中调用SpreadJS原生的Command的时候,在撤销栈中会存在两个撤销选项。
这在撤销的时候非常不友好,用户需要撤销两次,但是实际上他可能只是点击了一个按钮。
面对这样的问题我们应该如何解决呢?
以粘贴操作举一个简单的例子:
let mySpecialPaste = Object.assign(
{},
GC.Spread.Sheets.Commands.clipboardPaste
);
mySpecialPaste.canUndo = false;
spread.commandManager().register("myClipboardPaste", mySpecialPaste);
先创建一个clipboardPaste Command的拷贝,并修改其canUndo属性为false。
然后在自定义的Command中使用这个mySpecialPaste Command:
let test = {
canUndo: true,
name: "test",
execute: function (context, options, isUndo) {
let Commands = GC.Spread.Sheets.Commands;
if (isUndo) {
Commands.undoTransaction(context, options);
return true;
} else {
Commands.startTransaction(context, options);
let sheet = context.getSheetFromName(options.sheetName);
sheet.suspendPaint();
sheet.getCell(0, 0).value("123");
spread.commandManager().execute({
cmd: "myClipboardPaste",
sheetName: "Sheet1",
fromSheet: sheet,
fromRanges: fromRange,
pastedRanges: toRanges,
isCutting: true,
clipboardText: "",
pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all,
});
sheet.resumePaint();
Commands.endTransaction(context, options);
return true;
}
},
};
最后我们将这个Command注册并重写oldOpenMenu将这个Command添加到右键菜单中,并修改它的撤销重做栈中的命名:
spread.commandManager().register("test", test);
let oldOpenMenu = spread.contextMenu.onOpenMenu;
spread.contextMenu.onOpenMenu = function (
menuData,
itemsDataForShown,
hitInfo,
spread
) {
oldOpenMenu.apply(this, arguments);
console.log(itemsDataForShown);
itemsDataForShown.push({
text: "test",
name: "test",
command: "test",
workArea: "viewport",
});
};
let undoList = GC.Spread.Sheets.Designer.getCommand(
GC.Spread.Sheets.Designer.CommandNames.UndoList
);
let redoList = GC.Spread.Sheets.Designer.getCommand(
GC.Spread.Sheets.Designer.CommandNames.RedoList
);
redoList.commandMap["test"] = "test";
undoList.commandMap["test"] = "test";
designerConfig.commandMap = {};
designerConfig.commandMap =
undoList;
designerConfig.commandMap =
redoList;
let designer = new GC.Spread.Sheets.Designer.Designer(
"gc-designer-container",
designerConfig
);
以上就大功告成,此时执行命令就只有一个撤销选项了。
页:
[1]