后疫情办公时代——你需要的多人同步协同编辑Demo(可粘贴可撤销)

疫情,办公,时代,需要,同步,协同,编辑,demo,粘贴,撤销 · 浏览次数 : 271

小编点评

## 葡萄城命令机制详解 本文介绍了如何使用命令机制实现简单的在线协同操作,并结合示例代码演示了如何通过命令机制实现多人协同。 **命令机制的核心概念:** * 命令是封装操作的指令,可以分为执行操作和撤销操作。 * 命令可以设置是否可撤销,并结合撤销操作实现用户操作的撤销。 * 命令可以自定义实现,并提供用户操作的接口。 **示例代码:** ```javascript // 监听命令 spread.commandManager().addListener("anyscLicenser", function(commands) { // 处理用户操作 console.log(commands); }); // 自定义命令,实现用户点击按钮的操作 class MyCommand extends Command { execute() { // 用户点击按钮的操作逻辑 } } ``` **其他重要点:** * 命令机制可以实现多人同步的操作,并可以通过事件机制实时更新页面上的状态。 * 用户可以自定义命令的执行逻辑,以实现不同的操作方式。 * 命令机制可以用于实现各种复杂的操作,例如拖放、粘贴、撤销等。 **参考资料:** * 命令机制文档:`spread.commandManager().addListener()` * 示例代码:`demo.grapecity.com.cn/spreadjs/help/latest/content/SpreadJS~GC.Spread.Commands.CommandManager.html`

正文

本文由葡萄城技术团队于博客园原创并首发
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

新冠病毒的疫情使得在线办公成为了一个常态,这使得在线文档成为了时下的热点。其中在线协同表格是在线文档的重要一个组成部分,纯前端表格在在线协同表格上有着得天独厚的优势:本身已经实现了单人操作在线文档的基本功能,并且身为控件,用户只需引入就可以在项目工程中为特性的业务赋予在线表格的能力。这样开发者在使用本文介绍内容后,只需要在其基础上自行实现对应的协同功能,就可以将本身的单人操作变为协同操作。

最近也有很多学员想要通过我们的命令来作为协同的主要实现手段,但是参考了一些教程之后,发现有些操作无法进行同步,例如粘贴以及粘贴之后的撤销操作。这篇教程主要就是分享这个实现思路。
正式开始内容介绍之前,我们先为大家介绍命令机制。

通过监听命令来实现简单的协同操作

何为命令机制:
命令就是将一步或多步的操作封装成一个可以执行的命令,执行这样的命令并传入对应的参数,就可以执行相关的一连串操作。并且操作的对象或范围均可以通过参数的调整来指定。命令的相关方法调用参考下面的API:
https://demo.grapecity.com.cn/spreadjs/help/latest/content/SpreadJS~GC.Spread.Commands.CommandManager.html

命令究竟有什么实际的意义呢?
首先,纯前端表格默认会将所有的用户UI操作封装成命令去执行(内置命令),而我们通常的代码设置并没有通过命令来执行。这样就可以用来区分一个操作到底是用户UI操作(最终用户使用时的操作),还是代码逻辑进行的操作(程序员通过写代码完成,即程序内部的运行逻辑)。
其次,命令本身可以设置是否可以被撤销(undo),结合上一条就可以做到将用户的操作进行撤销,但是程序执行的代码操作不会被进行撤销的操作。在实际应用中有很重要的价值,举个例子:
SpreadJS默认初始化的电子表格是一个空表格,我们经常遇到打开页面后需要加载一个有数据的表格这样的场景,我们往往会将表格初始化的操作通过代码在js中运行来实现这样的效果。当我们加载好表格之后,在页面上按ctrl+z进行撤销,会发现设置的表格不会被撤销。这就是因为程序执行的代码操作不是命令所以不会被撤销的结果。而用户在表格上修改的任何操作均可以被撤销,撤销的同时不会影响之前代码设置这部分的内容。

命令对于在线协同的应用:
命令的机制我们可以分清操作到底是代码执行的还是用户UI去操作的,而在线协同的场景中需要同步的内容就是用户UI的相关操作。所以我们只需要有一个监听的机制,能监听到所有的命令,然后按照顺序进行同步,就可以做到一个简单的在线协同操作了。
而在命令command中是可以添加一个anyscLicenser用于收集用户操作触发的命令的:

spread.commandManager().addListener("anyscLicenser",function(){
    for(var i=0;i<arguments.length;i++){
        var cmd = arguments[i].command;
        console.log(cmd);
    }
                });

通过这样的监听,我们就可以实现一个简单的多人同步的效果。而命令本身是可以自定义的,我们可以将提供给用户操作的接口(input,按钮,下拉等)的实现逻辑封装成一个个自定义命令,就像附件的demo这样。这样就可以做到通过命令来收集用户在表格上的操作,来完成一个简单的协同。
这里要注意的是,虽然有命令这样的机制,但其初衷并不是为了协同而设置的,所以有些情况下源生的命令并不能完全的符合协同的实现,需要根据实际情况自己进行改造来满足。提供的demo以及命令实现的方式可当做思路可供参考。

demo下载地址:https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=ODY2MjZ8OTBlY2E0NWF8MTY3MTc5MzE5Mnw2MjY3Nnw3NTM0Nw%3D%3D

可粘贴柯撤销的多人协同

那最原始通过命令的方式为什么无法将粘贴命令同步呢?因为对于clipboardPaste命令,禁止将工作表的一个区域从工作簿复制到另一个工作簿,但允许外部粘贴。因此,有一种解决方法可以重置命令选项的fromSheet和fromRanges。附上核心代码

  var undoManager1 = spread1.undoManager();
                var oldExecute = commandManager.execute;
        commandManager.execute = function () {
                        console.log(arguments,'execute');
                        excute(...arguments)
            return oldExecute.apply(this, arguments);
        };
               
                var undoManager = spread.undoManager();
                var oldUndo = undoManager.undo;
        undoManager.undo = function () {
                        undo(...arguments)
            return oldUndo.apply(this, arguments);
        };
        var oldRedo = undoManager.redo;
        undoManager.redo = function () {
                        redo(...arguments)
            return oldRedo.apply(this, arguments);
        };

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

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

                }
                const  excute = (params)=>{
                        console.log(params,'params');
                        var params1 = params;
                        if(params1.cmd === 'clipboardPaste'){
                                params1 = Object.assign({}, params1);
                                params1.fromSheet=spread1.getSheetFromName(params1.sheetName);
                        }
            commandManager1.execute.apply(commandManager1, [params1]);
                }

demo下载地址:https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MjI1NTE3fDE4NGM0YWY3fDE2NzE3OTMxNzZ8NjI2NzZ8MTUyMTAw

大家如果感兴趣自行按照demo下载地址体验即可。

拓展阅读

React + Springboot + Quartz,从0实现Excel报表自动化

电子表格也能做购物车?简单三步就能实现

使用纯前端类Excel表格控件SpreadJS构建企业现金流量表

与后疫情办公时代——你需要的多人同步协同编辑Demo(可粘贴可撤销)相似的内容:

后疫情办公时代——你需要的多人同步协同编辑Demo(可粘贴可撤销)

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 新冠病毒的疫情使得在线办公成为了一个常态,这使得在线文档成为了时下的热点。其中在线协同表格是在线文档的重要一个组成部分,纯前端表格在在线协同表格上有着得天独厚的优势:本

[转帖]jar启动指定JDK/JRE 安装路径教程

https://blog.csdn.net/weixin_40986713/article/details/128136777 前言 因为疫情在家办公的缘故,有个老项目,需要改个接口,然后需要前端联调,因为外网服务器没有多余的空间了,想着把jar给前端让前端开发人员,在自己的本机启动后端服务,进行接

百万并发场景中倒排索引与位图计算的实践

Promise时效控单系统作为时效域的控制系统,在用户下单前、下单后等多个节点均提供服务,是用户下单黄金链路上的重要节点;控单系统主要逻辑是针对用户请求从规则库中找出符合条件的最优规则,并将该规则的时效控制结果返回客户端,比如因为临时疫情等原因针对仓、配、商家、客户四级地址等不同维度进行精细粒度的时效控制。

工作流Activiti 迁移 Camunda

后端操作 意思就是: ①更改maven②改包名、类名③改bpmn model中语法④检查迁移后有哪些功能缺失了 1、更改maven 改为 2、换包名、类名 意思就是将 org.activiti.* 开头的改为 org.camunda.bpm.* 3、改bpmn model中语法 不改的话会出现语法解

后端每日一题 2:DNS 解析过程

本文首发于公众号:腐烂的橘子 本文梗概: DNS 是什么,有什么作用 一条 DNS 记录是什么样的 DNS 域名解析原理 DNS 服务器如何抵御攻击 DNS 是什么,有什么作用 DNS(Domain Name System)是一种应用层协议,用于映射域名和 ip 地址。 为什么要做映射呢?就像可以用

后端每日一题 1:说一下三次握手

本文首发于公众号:腐烂的橘子 三次握手的流程 第 1 步 - 初始连接请求 SYN(Synchronize) 服务端状态 LISTEN,客户端向服务端发送一个 SYN 标志位的报文段(TCP segment) 这个报文段包含初始序列号 x,以及最大报文段大小等字段 客户端发送报文后,状态设置为 SY

Git 版本控制:构建高效协作和开发流程的最佳实践

版本控制是软件开发的核心,促进团队协作与项目管理。通过制定明确的分支命名策略,遵循一致的代码提交规范,如指明提交类型和简短描述,增强了历史记录的可读性,可以清晰地组织和理解项目的结构与进展。

后量子密码研究思考与实践

后量子密码研究思考与实践 中国电信翼支付后量子密码研究思考与实践 量子计算的威胁 2022年10月,法国物理学家阿兰•阿斯佩Alain Aspect,美国理论与实验物理学家约翰•弗朗西斯•克劳泽John F. Clauser以及奥地利科学家安东•塞林格Anton Zeilinger共同获得了诺贝物理

跨域:后端工程师最熟悉的陌生“人”

摘要:跨域,对后端工程师来说,可谓既熟悉又陌生。 本文分享自华为云社区《后端老司机的跨域之旅》,作者: 勇哥java实战分享。 跨域,对后端工程师来说,可谓既熟悉又陌生。 这两个月我以架构师的角色参与一款教育产品的孵化,有了一段难忘的跨域之旅。 写这篇文章,我想分享我在跨域这个知识点的经历和思考,希

后端服务之应用预热

一 背景 C端服务应用升级和重启,导致耗时瞬时抖动,业务超时,应用监控报警,上游感知明显,导致用户体验变差。 二 应用升级重启导致抖动的原因 1 C端服务应用升级和重启的冷启动阶段,它需要重新加载和初始化各种资源,例如数据库连接、缓存数据等,导致耗时瞬时飙升。 2 应用重启后,本地缓存失效,应用需要