2015-06-22 6 views
11

Я хочу сбросить стопку отмены в ACE editor. Поведение должно быть:Сбросить стопку отмены в редакторе ACE

  1. Я делаю некоторые изменения в редакторе.
  2. Вызов некоторой волшебной функции для сброса стека отмены
  3. При попытке отменить это невозможно, поскольку сброс стека отменен.

Я думаю, что это связано с UndoManager от ACE, но я не знаю, как его использовать в следующем примере.

var editor = ace.edit("editor"); 
 
editor.setTheme("ace/theme/monokai"); 
 
editor.getSession().setMode("ace/mode/markdown"); 
 

 
setTimeout(function() { 
 
    editor.setValue("And now how can I reset the\nundo stack,so pressing\nCTRL+Z (or Command + Z) will *NOT*\ngo back to previous value?", -1); 
 
}, 3000);
#editor { 
 
    position: absolute; 
 
    top: 0; 
 
    right: 0; 
 
    bottom: 0; 
 
    left: 0; 
 
    font-size: 25px; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.9/ace.js"></script> 
 
<div id="editor">This value will be changed in 3 seconds.</div>

Я посмотрел в editor и editor.session прототипов, чтобы найти некоторые вспомогательные функции, но без успеха.

ответ

13

Да, UndoManager это класс, который сохраняет всю историю. Решение состоит в том, чтобы инициализировать сеанс пустым/вновь созданным классом.

Проверьте фрагмент.

var editor = ace.edit("editor"); 
 
editor.setTheme("ace/theme/monokai"); 
 
editor.getSession().setMode("ace/mode/markdown"); 
 

 
setTimeout(function() { 
 
    editor.setValue("And now how can I reset the\nundo stack,so pressing\nCTRL+Z (or Command + Z) will *NOT*\ngo back to previous value?", -1); 
 
    editor.getSession().setUndoManager(new ace.UndoManager()) 
 
}, 3000);
#editor { 
 
    position: absolute; 
 
    top: 0; 
 
    right: 0; 
 
    bottom: 0; 
 
    left: 0; 
 
    font-size: 25px; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.9/ace.js"></script> 
 
<div id="editor">This value will be changed in 3 seconds.</div>

+0

Но теперь я не могу CTRL + Z ничего. –

+0

Да, это было требование, я думаю? или вы просто хотите удалить последнее изменение, которое произошло с помощью JavaScript? Просьба уточнить ... – skbly7

+0

Я хочу сбросить все до этой точки, но после этого я хочу использовать отмену. –

2

использование editor.session.setValue() или позвоните editor.session.getUndoManager().reset(); см https://github.com/ajaxorg/ace/blob/v1.1.9/lib/ace/edit_session.js#L279

+0

Ммм, я попытался с помощью '' сброса) метод (, но [не работает] (http://jsfiddle.net/q8x8p5nc/), почему? –

+0

Поскольку он выглядит как editor.session.getUndoManager() возвращает конструктор для undoManger, он возвращает функцию: 'function() {this.reset()}' –

+2

вызов сброса немедленно не работает, поскольку изменения добавляются в undoManager после тайм-аута –