我想在浏览器会话中保留Ace Editor的UndoManager
实例,就像Cloud9 IDE那样。
我试图对UndoManager
对象进行字符串化处理,以便可以将其存储在某个地方,以便以后像这样检索它:
let undoManager = editorHTML.getSession().getUndoManager();
let undoManagerStr = JSON.stringify(undoManager);
但是stringify调用会引发异常Uncaught TypeError: Converting circular structure to JSON
我还尝试提取对象的一部分进行存储:
let redoStackStr = JSON.stringify(undoManager.$redoStack, null, 2);
let undoStackStr = JSON.stringify(undoManager.$undoStack, null, 2);
let dirtyCounter = undoManager.dirtyCounter;
。
let manager = new ace.UndoManager();
if(redoStackStr && undoStackStr && dirtyCounter) {
manager.$redoStack = JSON.parse(redoStackStr);
manager.$undoStack = JSON.parse(undoStackStr);
manager.dirtyCounter = dirtyCounter;
}
editorHTML.getSession().setUndoManager(manager)
但是Ace一点都不喜欢这样,并在CTRL-Z上炸了
当一个文件历史管理器已经存在时,我宁愿不必编写自己的文件历史记录管理器。
修改
仅在升级到Ace编辑器1.4.2版后,我才能使用下面选择的答案解决此问题。上面的代码是我在分析版本1.2.8中的UndoManager
之后做出的尝试,这就是为什么它如此不同的原因。
答案 0 :(得分:1)
使用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)
但是请注意,如果对具有不同值的会话执行此操作将失败。