2015-06-22 23 views
11

Desidero ripristinare lo stack di annullamento in un ACE editor. Il comportamento dovrebbe essere:Reimposta lo stack di annullamento nell'editor ACE

  1. Ho apportato alcune modifiche nell'editor.
  2. Chiama alcune funzioni magiche per ripristinare lo stack di annullamento
  3. Quando si tenta di annullare, ciò non sarà possibile perché lo stack di annullamento è stato reimpostato.

Immagino che abbia a che fare con lo UndoManager di ACE, ma non ho idea di come posso usarlo nel seguente esempio.

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>

Ho esaminato editor e editor.session prototipi di trovare qualche funzione di supporto, ma senza successo.

risposta

13

Sì, UndoManager è la classe che mantiene tutta la storia. La soluzione è di inizializzare la sessione con una classe vuota/appena creata.

Controlla lo snippet.

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

Ma ora non riesco a CTRL + Z nulla. –

+0

Sì, quello era il requisito che immagino? o vuoi solo rimuovere l'ultima modifica ... che è successo da JavaScript? Si prega di chiarire ... – skbly7

+0

Voglio reimpostare tutto fino a quel punto, ma dopo voglio essere in grado di usare annulla. –

2

uso editor.session.setValue() o chiamare editor.session.getUndoManager().reset(); vedere https://github.com/ajaxorg/ace/blob/v1.1.9/lib/ace/edit_session.js#L279

+0

Hmmm, ho provato ad utilizzare il 'Metodo di reset()', ma [non funziona] (http://jsfiddle.net/q8x8p5nc/), perché? –

+0

Poiché sembra un editor.necessario() restituisce un costruttore per undoManger restituisce la funzione: 'function() {this.reset()}' –

+2

reset di chiamata immediatamente non funziona, perché le modifiche vengono aggiunte a undoManager dopo un timeout –