Сохраняйте редактор ACE UndoManager между сеансами - PullRequest
0 голосов
/ 07 декабря 2018

Я хотел бы сохранить экземпляр 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)

Но Эйсу это совсем не нравится, и он взрывает CTRL-Z

Я бы предпочел не писать собственный менеджер истории файлов, когда он уже существует.

Редактировать

Я смог решить эту проблему, используя ответ, выбранный ниже, нотолько после обновления до версии Ace Editor 1.4.2.Приведенный выше код был моей попыткой после анализа UndoManager в версии 1.2.8, поэтому он настолько отличается.

1 Ответ

0 голосов
/ 08 декабря 2018

В 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)

Но учтите, что это не удастся, если вы сделаете это для сеансов с другими значениями.

...