找回密码
 立即注册

QQ登录

只需一步,快速开始

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证

超级版主

200

主题

9899

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
15531

讲师达人悬赏达人微信认证勋章SpreadJS 认证SpreadJS 高级认证元老葡萄

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-2-1 18:53  /   查看:1024  /  回复:0
本帖最后由 Clark.Pan 于 2023-2-1 19:08 编辑

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

如有想继续了解SpreadJS在表单保护状态下粘贴时候,如果遇到锁定单元格则跨越过去这种需求完整实现的同学,请关注后续博客《SpreadJS在已有快捷键功能基础上追加操作》。


0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部