Javascript 跨会话持久化ACE编辑器管理器

Javascript 跨会话持久化ACE编辑器管理器,javascript,ace-editor,Javascript,Ace Editor,我想在浏览器会话中持久化'sUndoManager实例,就像 我已尝试将UndoManager对象字符串化,以便将其存储在某个位置,以便以后像这样检索它: let undoManager = editorHTML.getSession().getUndoManager(); let undoManagerStr = JSON.stringify(undoManager); 但是stringify调用抛出异常uncaughttypeerror:将循环结构转换为JSON 我还尝试提取对象

我想在浏览器会话中持久化's
UndoManager
实例,就像

我已尝试将
UndoManager
对象字符串化,以便将其存储在某个位置,以便以后像这样检索它:

 let undoManager    = editorHTML.getSession().getUndoManager();
 let undoManagerStr = JSON.stringify(undoManager);
但是stringify调用抛出异常
uncaughttypeerror:将循环结构转换为JSON

我还尝试提取对象的片段进行存储:

 let redoStackStr       = JSON.stringify(undoManager.$redoStack, null, 2);
 let undoStackStr       = JSON.stringify(undoManager.$undoStack, null, 2);
 let dirtyCounter       = undoManager.dirtyCounter;

但艾斯根本不喜欢这样,在CTRL-Z上爆炸

我不希望在已经存在文件历史管理器的情况下编写自己的文件历史管理器

编辑


我能够使用下面选择的答案解决这个问题,但只有在升级到Ace editor 1.4.2版之后。上面的代码是我在分析版本1.2.8中的
UndoManager
之后的尝试,这就是为什么它如此不同的原因。

对于ace 1.4,您提到的第二种方法有效,示例中唯一的问题是dirtyCounter未定义

UndoManager = require("ace/undomanager").UndoManager
undoManager = editor.session.$undoManager
var str  = JSON.stringify({ 
    $redoStack: undoManager.$redoStack,
    $undoStack: undoManager.$undoStack,
    mark: undoManager.mark,
    $rev: undoManager.$rev,
 })
 var manager = new UndoManager();
 if (str) {
     var json = JSON.parse(str)
      manager.$redoStack = json.$redoStack;
      manager.$undoStack = json.$undoStack
      manager.mark = json.mark
      manager.$rev = json.$rev
 }
 editor.getSession().setUndoManager(manager)

但请注意,如果您对具有不同值的会话执行此操作,则此操作将失败。

很高兴知道此操作可行-我对我的示例中如何未定义dirtyCounter感到有点困惑。您使用哪种版本的ace?dirtyCounter在一个旧版本中,但后来被删除。我已经从v1.2.8升级到v1.4.2,您的代码现在可以为我工作了。谢谢
UndoManager = require("ace/undomanager").UndoManager
undoManager = editor.session.$undoManager
var str  = JSON.stringify({ 
    $redoStack: undoManager.$redoStack,
    $undoStack: undoManager.$undoStack,
    mark: undoManager.mark,
    $rev: undoManager.$rev,
 })
 var manager = new UndoManager();
 if (str) {
     var json = JSON.parse(str)
      manager.$redoStack = json.$redoStack;
      manager.$undoStack = json.$undoStack
      manager.mark = json.mark
      manager.$rev = json.$rev
 }
 editor.getSession().setUndoManager(manager)