找回密码
 立即注册

QQ登录

只需一步,快速开始

Derrick.Jiao 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-8-9 17:08  /   查看:2292  /  回复:0
本帖最后由 Lynn.Dou 于 2023-9-13 15:17 编辑

背景:有很多用户想要通过我们的命令来作为协同的主要实现手段。但是参考了论坛的一些教程之后,发现有些操作无法进行同步,例如粘贴以及粘贴之后的撤销操作。这篇教程主要就是分享这个实现思路。

那么想要通过监听命令来实现简单协同,可以参考这篇文章
https://gcdn.grapecity.com.cn/showtopic-75347-1-1.html

想实现可撤销的示例,可以参考这篇文章
https://gcdn.grapecity.com.cn/showtopic-73728-1-25.html

那最原始通过命令的方式为什么无法将粘贴命令同步呢?因为对于clipboardPaste命令,禁止将工作表的一个区域从工作簿复制到另一个工作簿,但允许外部粘贴。因此,有一种解决方法可以重置命令选项的fromSheet和fromRanges。附上核心代码
  1.         var undoManager1 = spread1.undoManager();
  2.                 var oldExecute = commandManager.execute;
  3.         commandManager.execute = function () {
  4.                         console.log(arguments,'execute');
  5.                         excute(...arguments)
  6.             return oldExecute.apply(this, arguments);
  7.         };
  8.                
  9.                 var undoManager = spread.undoManager();
  10.                 var oldUndo = undoManager.undo;
  11.         undoManager.undo = function () {
  12.                         undo(...arguments)
  13.             return oldUndo.apply(this, arguments);
  14.         };
  15.         var oldRedo = undoManager.redo;
  16.         undoManager.redo = function () {
  17.                         redo(...arguments)
  18.             return oldRedo.apply(this, arguments);
  19.         };

  20.                 // websocket 接受端执行  
  21.                 const  redo =function (params){
  22.                         console.log(params,'params');
  23.                         undoManager1.redo.apply(undoManager1, [params]);

  24.                 }
  25.                 const  undo =function (params){
  26.                         console.log(params,'params');
  27.                         undoManager1.undo.apply(undoManager1, [params]);

  28.                 }
  29.                 const  excute = (params)=>{
  30.                         console.log(params,'params');
  31.                         var params1 = params;
  32.                         if(params1.cmd === 'clipboardPaste'){
  33.                                 params1 = Object.assign({}, params1);
  34.                                 params1.fromSheet=spread1.getSheetFromName(params1.sheetName);
  35.                         }
  36.             commandManager1.execute.apply(commandManager1, [params1]);
  37.                 }
复制代码


以上这个就是大致的思路,具体请参考附件demo。

commandManager_updated.html

2.38 KB, 下载次数: 274

0 个回复

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