找回密码
 立即注册

QQ登录

只需一步,快速开始

mmm223

金牌服务用户

11

主题

34

帖子

107

积分

金牌服务用户

积分
107
mmm223
金牌服务用户   /  发表于:2024-7-23 18:34  /   查看:638  /  回复:7
本帖最后由 Joestar.Xu 于 2024-7-24 14:18 编辑


调研编号:SJS-25586

比如我当前正在编辑一个单元格,此时另一个用户进行了操作,我这里接收到同步信息,进行setValue,此时我正在编辑的那个单元格就失去了焦点。

同理假如我在下拉选择值,接受到任意一个同步信息,例如填充
  1. commandMgr.execute({ cmd: "fill", sheetName, startRange: sRange, fillRange: fRange, autoFillType, fillDirection, sync: true });
复制代码
执行完,我的下拉框消失了,失去了焦点,需要重新点击下拉选择。
这个问题挺严重的,协同操作非常的不流畅,帮帮我,demo不太好给,但是就是execute的方式去更改值,急急急

7 个回复

倒序浏览
mmm223
金牌服务用户   /  发表于:2024-7-24 09:51:22
沙发
挂起绘制与恢复绘制
每当表单中包含变更时,SpreadJS 会自动刷新。
是因为这个特性的原因?不能设置成局部刷新吗
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-7-24 09:58:25
板凳
您好,SpreadJS中部分Command在执行完后都会修改WorkSheet上的焦点,如果不想修改焦点,需要您自行开发对应的Command来实现。

举一个简单的例子,在下图中的这种情况下,执行fill命令,会移动焦点到A1:A4,导致下拉框消失:

image.png70998839.png

这是由于fill命令中存在修改焦点的逻辑代码,而这部分已经被封装起来了无法二次修改,所以只能重新再创建一个fill命令,在这个fill命令中只执行填充数据的操作,不执行修改焦点的操作。

这样将该命令传递给其他端的WorkBook时就不会修改焦点了。
回复 使用道具 举报
mmm223
金牌服务用户   /  发表于:2024-7-24 10:14:10
地板
Joestar.Xu 发表于 2024-7-24 09:58
您好,SpreadJS中部分Command在执行完后都会修改WorkSheet上的焦点,如果不想修改焦点,需要您自行开发对应 ...

你好。我这里还同步了点击框,代表 协同的人编辑到哪里,会把那一个单元格加一个对应颜色的边框,测试下来,似乎这种操作也执行了刷新
  1. /**
  2.    * 标记选中的单元格
  3.    */
  4.   function markClickedCells() {
  5.     //对旧的激活单元格进行清除
  6.     let defaultType = new GC.Spread.Sheets.CellTypes.Text()
  7.     Object.keys(CacheClickedCells).forEach((userName) => {
  8.       let info = CacheClickedCells[userName]
  9.       sheet.setCellType(info.row, info.col, defaultType)
  10.     })
  11.     Object.keys(ClickedCells).forEach((userName) => {
  12.       let info = ClickedCells[userName]
  13.       const color = '#' + userColorMap[userName].color ?? '000'
  14.       const id = "userId_" + userName + "_upperborder"
  15.       if (info.col !== -1 && info.row !== -1) {
  16.         let cellType = new ClickedCell(color)
  17.         cellType.userName = userName
  18.         sheet.setCellType(info.row, info.col, cellType)
  19.         CacheClickedCells = {
  20.           ...CacheClickedCells,
  21.           [userName]: {
  22.             row: info.row,
  23.             col: info.col,
  24.           },
  25.         }
  26.         const hideRow = hiddenRowRef.current

  27.         if (!hideRow.includes(info.row)) {
  28.           //存在才会去生成
  29.           CoopFloatingObject.showCoopFloatingObject(sheet, info.row, info.col, 0, 0, id, userName, color)
  30.         } else {
  31.           CoopFloatingObject.removeFloatingObject(sheet, id)
  32.         }
  33.       } else {
  34.         clearClickedCellsStyle(id, info)
  35.       }
  36.     })
  37.   }
复制代码

这种也会让焦点失去或者我监听了编辑结束,
  1. //单元格修改=
  2.         case 'end_edit': {
  3.           const { row, col, value, hideRow, unHideRow, startRow } = msg
  4.           onRowVisibleChange(msg)
  5.           if (checkFormulaType(value)) {
  6.             sheet.setFormula(row, col, value, GC.Spread.Sheets.SheetArea.viewport);
  7.           } else {
  8.             if (msg.hasOwnProperty('value')) {
  9.               sheet.setValue(row, col, value);
  10.             }
  11.           }
  12.           break;
  13.         }
复制代码


setValue也会失去
回复 使用道具 举报
mmm223
金牌服务用户   /  发表于:2024-7-24 10:36:08
5#
只要一进行改动,就会失去焦点,我做了演示视频,编辑也是一样的,就是好好的在编辑的,以改动,立马就没了,需要再次点击修改 iShot_2024-07-24_10.31.33.mp4 (11.58 MB, 下载次数: 73)
回复 使用道具 举报
mmm223
金牌服务用户   /  发表于:2024-7-24 10:37:46
6#
Joestar.Xu 发表于 2024-7-24 09:58
您好,SpreadJS中部分Command在执行完后都会修改WorkSheet上的焦点,如果不想修改焦点,需要您自行开发对应 ...

请看一下我发的演示视频
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-7-24 10:50:58
7#
您好,您描述的情况我了解了,这边调研一下,后续有进展我会在本贴中回复您。
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-7-31 16:41:00
8#
您好,经调研,这是目前SpreadJS的设计,一些核心命令需要一个完整的周期来更新当前的表格、焦点、活动单元格、单元格状态等。

它不是简单地调用setValue,也就是说,不能让两个单元格同时进入编辑模式。

这边也暂时没有其他方案能够实现这个需求。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部