找回密码
 立即注册

QQ登录

只需一步,快速开始

sup123

注册会员

1

主题

3

帖子

12

积分

注册会员

积分
12
  • 38

    金币

  • 1

    主题

  • 3

    帖子

最新发帖
sup123
注册会员   /  发表于:2023-3-8 11:09  /   查看:1271  /  回复:1



1:自定义一个命令(addRow):首行下面插入一行,且命令不允许撤销
   

2:执行流程
1>编辑单元格 ,比如第2行第1列,
2>执行命自定义命令(addRow)
3> ctr+z 进行撤销,因为第二步自定义命令不允许撤销,会执行第一步 编辑单元格的撤销,
      实际撤销时,撤销的还是第2行,第1列,。因为插入了行,应该撤销第3行第1列。

这种情况,是否有办法可以解决? 否则有自定义命令不允许撤销的,其它编辑的撤销都可能位置错乱。

  1. <!DOCTYPE html>
  2. <html lang="en">

  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <meta name="spreadjs culture" content="zh-cn" />
  8.     <!-- 引入SpreadJS相关的CSS,默认会有一个CSS
  9.     SpreadJS默认提供了7种CSS,可以选择一个适合当前项目的引入
  10. -->
  11.     <link rel="stylesheet" type="text/css" href="./css/gc.spread.sheets.excel2013lightGray.16.0.2.css" />
  12.     <!-- 核心资源,最小依赖资源,只要引入了该资源,组件运行时就能显示出来 -->
  13.     <script type="text/javascript" src="./js/gc.spread.sheets.all.16.0.2.min.js"></script>
  14.     <!-- 中文资源文件,组件运行时默认会用英文资源,使用中文资源需要引入并设置 -->
  15.     <script type="text/javascript" src="./js/resources/zh/gc.spread.sheets.resources.zh.16.0.2.min.js"></script>
  16.     <!-- 导入导出excel文件的相关资源 -->
  17.     <script type="text/javascript" src="./js/plugins/gc.spread.sheets.io.16.0.2.min.js"></script>
  18.     <title>原生js引入组件运行时</title>

  19. </head>
  20. <style>
  21.     #ss {
  22.         height: 97vh;
  23.     }
  24. </style>

  25. <body>
  26.     <br>
  27.     <input type="button" id="addRowNotSupportUndo" value="第一行后插入行(不支持撤销)" class="button">
  28.     <input type="button" id="addRowSupportUndo" value="第一行后插入行(支持撤销)" class="button">

  29.     <div id="ss"></div>
  30.     <script>
  31.         window.onload = function () {

  32.             // 创建一个工作表数量为1,显示上下文菜单
  33.             let spread = new GC.Spread.Sheets.Workbook('ss', {
  34.                 sheetCount: 1,
  35.                 allowContextMenu: true
  36.             })
  37.             //注册自定义命令
  38.             registerAddRowCmd(spread);

  39.             document.getElementById('addRowNotSupportUndo').onclick = function () {
  40.                 doAddRowCmd(spread, false);
  41.             }
  42.             document.getElementById('addRowSupportUndo').onclick = function () {
  43.                 doAddRowCmd(spread, true);
  44.             }
  45.         }

  46.         var registerAddRowCmd = function (spread) {
  47.             var commandManager = spread.commandManager();

  48.             var commandAddRowNotSupportUndo = {
  49.                 canUndo: false,  //不支持撤销
  50.                 execute: addRowAction
  51.             }

  52.             commandManager.register('cus.addRowNotSupportUndo', commandAddRowNotSupportUndo, null, false, false, false, false);

  53.             var commandAddRowSupportUndo = {
  54.                 canUndo: true,  //支持撤销
  55.                 execute: addRowAction
  56.             };
  57.             commandManager.register('cus.addRowSupportUndo', commandAddRowSupportUndo, null, false, false, false, false);
  58.         };


  59.         var addRowAction = function (spread, options, isUndo) {
  60.             var Commands = GC.Spread.Sheets.Commands;
  61.             if (isUndo) {
  62.                 console.log(options)
  63.                 Commands.undoTransaction(spread, options);
  64.                 console.log("undo finish")
  65.                 return true;
  66.             } else {
  67.                 Commands.startTransaction(spread, options);
  68.                 spread.suspendPaint();
  69.                 insertRow(spread);
  70.                 spread.resumePaint();
  71.                 Commands.endTransaction(spread, options);
  72.                 return true;
  73.             }
  74.         }

  75.         var doAddRowCmd = function (spread, canUndo) {
  76.             var commandName = canUndo ?  "cus.addRowSupportUndo":"cus.addRowNotSupportUndo";
  77.             var commandManager = spread.commandManager();
  78.             var sheet = spread.getActiveSheet();
  79.             commandManager.execute({
  80.                 cmd: commandName,
  81.                 sheetName: spread.getSheet(0).name()
  82.             });
  83.         }

  84.         function insertRow(spread) {
  85.             let sheet = spread.getActiveSheet()
  86.             sheet.addRows(1, 1);
  87.         }

  88.     </script>
  89. </body>

  90. </html>
复制代码


1 个回复

倒序浏览
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-8 15:18:04
沙发
您好,
当自定义命令 涉及到行列等结构性的变动时,无法通过是否撤销来进行控制。
针对这类需求,建议是:当遇到结构性变化时,清空undo/redo栈,此时不允许再撤销。
为了便于理解,以组件版设计器为例(下方动图),在输入单元格值后,您可以尝试在控制台通过代码插入行,此时你会发现工具栏撤销按钮禁用,即不允许再撤销了。
实质上设计器这里所做的,就是清空了撤销栈,以避免您题目中所述的撤销混乱问题。
image.png833710937.png
image.png397564696.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部