You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ace Editor自定义撤销后clearSelection()失效问题求助

解决Ace Editor重写撤销后clearSelection()无效的问题

从你描述的撤销后状态能看到,内容已经回退到初始状态,但之前修改的区域还保持着高亮选中——这正是因为Ace的undo操作在恢复内容的同时,会自动恢复撤销前的选区状态,而你调用的clearSelection()执行时机太早,被后续的选区恢复动作覆盖了。

先看你的代码逻辑:

public handleUndo(modal) { 
  this.templateeditor.getEditor().session.getUndoManager().undo(); 
  this.templateeditor.getEditor().getSelection().clearSelection(); 
}

这里你先执行undo(),紧接着就调用clearSelection(),但Ace内部的undo流程中,恢复选区的动作是在你的清除操作之后完成的,导致你的设置被直接覆盖。

解决方案1:延迟执行清除选区操作

用setTimeout让清除动作等undo的内部流程完成后再执行,这是最快速验证的方案:

public handleUndo(modal) { 
  const editor = this.templateeditor.getEditor();
  editor.session.getUndoManager().undo(); 
  // 延迟10ms,确保undo的选区恢复动作完成
  setTimeout(() => {
    editor.getSelection().clearSelection();
    // 可选:如果仍有问题,加上编辑器聚焦确保光标状态正确
    editor.focus();
  }, 10);
}

解决方案2:监听Undo完成事件

Ace编辑器会在undo操作完成后触发change事件,你可以在事件回调里清除选区,时机更准确:

// 编辑器初始化时绑定事件
const editor = this.templateeditor.getEditor();
editor.session.on('change', (event) => {
  // 判断是否为undo操作(不同Ace版本可能需要调整判断逻辑)
  if (event.type === 'undo') {
    editor.getSelection().clearSelection();
  }
});

// 你的撤销命令保持不变
this.templateeditor.getEditor().commands.addCommand({ 
  name: 'annotateCommand', 
  bindKey: { win: 'ctrl-z', mac: 'Command-z' }, 
  exec: (editor: any) => { this.handleUndo(this.modal); } 
});

public handleUndo(modal) { 
  this.templateeditor.getEditor().session.getUndoManager().undo(); 
}

解决方案3:手动设置光标位置替代清除选区

与其清除选区,不如直接把光标定位到某个固定位置(比如内容末尾),这样能直接覆盖undo恢复的选区:

public handleUndo(modal) { 
  const editor = this.templateeditor.getEditor();
  editor.session.getUndoManager().undo(); 
  // 获取最后一行的位置
  const lastRow = editor.session.getLength() - 1;
  const lastCol = editor.session.getLine(lastRow).length;
  // 移动光标到最后一行末尾,自动清除选区
  editor.selection.moveTo(lastRow, lastCol);
}

额外排查建议

  • 检查Ace Editor版本:不同版本的undo管理器行为可能有差异,尝试升级到最新稳定版。
  • 排查其他代码干扰:确认没有其他自定义命令、事件监听器在undo后修改选区状态。

你可以先试试第一种延迟方案,大部分情况下都能解决这个问题。

内容的提问来源于stack exchange,提问作者Piyush Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:59:32