需求场景:
基于SpreadJS的支持自定义快捷键功能,适用于已有的快捷键功能需要保留,并且在其基础上追加新的操作。例如:SpreadJS在表单保护状态下粘贴时候,如果遇到锁定单元格则跨越过去这样的需求。
分析:
保单保护状态下源生的复制粘贴,在判断粘贴内容是如果存在锁定单元格则粘贴会失效。这样并不是我们想要的,分析上述需求,可以得到思路,如果在粘贴之前先取消表单保护,然后再在粘贴相关的事件中缓存粘贴前锁定单元格的数据。之后再在粘贴之后将缓存的数据重写入对应的单元格,之后再将表单重新保护起来。这样就可以保证实现粘贴跨越锁定单元格这样的操作了。
再进一步分析,由于粘贴前判断如果区域存在锁定单元格粘贴时,粘贴操作不会被执行,也就压根不会触发粘贴相关的事件。所以无法通过事件进行取消表单保护的操作。那么就只能通过修改粘贴的快捷键ctrl+v功能来实现了。这里就需要在原有ctrl+v快捷键逻辑上追加解除表单保护的操作。
功能实现:
首先我们需要将解除保护的操作注册成一个命令
- var command = {
- canUndo: true,
- execute: function (context, options, isUndo) {
- var Commands = GC.Spread.Sheets.Commands;
- options.cmd = "unprotect";
- if (isUndo) {
- Commands.undoTransaction(context, options);
- return true;
- } else {
- Commands.startTransaction(context, options);
- var sheet = context.getSheetFromName(options.sheetName);
- sheet.options.isProtected = false;
- Commands.endTransaction(context, options);
- return false;
- }
- }
- };
复制代码 注意的是在Commands.endTransaction(context, options);这句代码之后的return结果是false(一般注册命令的时候这里都是true)。
这里的false的意义在于如果设置false,则不会阻断源生快捷键上已经注册的命令操作,这样就会在执行完毕之后再去执行原有快捷键上的操作逻辑。(如果为true,则在执行完毕后会阻断之后的操作)
之后我们将这个命令注册到Ctrl+V上即可。
- var commandManager = spread.commandManager();
- commandManager.register("unprotect", command);
- spread.commandManager().setShortcutKey('unprotect', GC.Spread.Commands.Key.v, true, false, false, false);
复制代码 上述代码在走到return false之后,由于return 结果是false,就会找Ctrl+V上的其他逻辑,发现Ctrl+V上有源生操作就会放到最后去执行。由此我们实现了在粘贴之前先将表单保护去掉的操作。 |