Jak zmienić obszar tekstowy w edytor ACE?

96

Chciałbym móc konwertować określone obszary tekstu na stronie do edytorów ACE.

Czy ktoś ma jakieś wskazówki?

EDYTOWAĆ:

Mam plik editor.html działający z jednym obszarem tekstowym, ale jak tylko dodam drugi, drugi nie jest konwertowany na edytor.

EDYCJA 2:

Postanowiłem porzucić pomysł posiadania kilku i zamiast tego otworzyć jeden w nowym oknie. Moim nowym problemem jest to, że kiedy ukrywam () i pokazuję () obszar tekstowy, wyświetlacz działa nieprawidłowo. Jakieś pomysły?

Paweł
źródło
1
Ten facet ma świetne rozwiązanie: gist.github.com/duncansmart/5267653
billynoah

Odpowiedzi:

159

O ile rozumiałem ideę Asa, nie powinieneś sam tworzyć obszaru tekstowego jako edytora Asa. Zamiast tego należy utworzyć dodatkowy div i zaktualizować textarea za pomocą funkcji .getSession () .

html

<textarea name="description"/>
<div id="description"/>

js

var editor = ace.edit("description");
var textarea = $('textarea[name="description"]').hide();
editor.getSession().setValue(textarea.val());
editor.getSession().on('change', function(){
  textarea.val(editor.getSession().getValue());
});

lub po prostu zadzwoń

textarea.val(editor.getSession().getValue());

tylko wtedy, gdy wyślesz formularz z podanym obszarem tekstu. Nie jestem pewien, czy jest to właściwy sposób korzystania z Ace, ale tak jest w przypadku GitHub .

installero
źródło
1
Wartość textarea należy aktualizować tylko przy form.submit event no? Ponadto, zgodnie z tym: groups.google.com/group/ace-discuss/browse_thread/thread/… Nie ma obsługi zastępowania textarea. Twoja odpowiedź jest wtedy dobra. Dzięki.
Damien
4
Czasami musisz zaktualizować wartość textarea w podróży, na przykład w celu zaimplementowania automatycznego zapisywania wersji roboczej lub w inny sposób.
installero
Mam problem z tą metodą: wysyłanie SMS-a „SELECT 1 OR 2;” na ace.editor przejdzie 'SELECT&nbsp;1OR&nbps;2;'do textarea. Czy ktoś może mi powiedzieć, co robię źle?
alexglue
alexglue, czy ustawiłeś white-space: nowrap na swoim obszarze tekstowym? github.com/ajaxorg/ace/issues/900
installero
Installero, nie mam tej właściwości CSS w moim obszarze tekstowym. Więc nie, nie zrobiłem tego.
alexglue
33

Duncansmart ma na swojej stronie github całkiem fajne rozwiązanie, progressive-ace, które pokazuje prosty sposób na podłączenie edytora ACE do twojej strony.

Zasadniczo otrzymujemy wszystkie <textarea>elementy z data-editoratrybutem i konwertujemy każdy na edytor ACE. Przykład ustawia również niektóre właściwości, które należy dostosować do własnych upodobań, i pokazuje, jak można używać dataatrybutów do ustawiania właściwości dla poszczególnych elementów, takich jak pokazywanie i ukrywanie rynny data-gutter.

// Hook up ACE editor to all textareas with data-editor attribute
$(function() {
  $('textarea[data-editor]').each(function() {
    var textarea = $(this);
    var mode = textarea.data('editor');
    var editDiv = $('<div>', {
      position: 'absolute',
      width: textarea.width(),
      height: textarea.height(),
      'class': textarea.attr('class')
    }).insertBefore(textarea);
    textarea.css('display', 'none');
    var editor = ace.edit(editDiv[0]);
    editor.renderer.setShowGutter(textarea.data('gutter'));
    editor.getSession().setValue(textarea.val());
    editor.getSession().setMode("ace/mode/" + mode);
    editor.setTheme("ace/theme/idle_fingers");

    // copy back to textarea on form submit...
    textarea.closest('form').submit(function() {
      textarea.val(editor.getSession().getValue());
    })
  });
});
textarea {
  width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js"></script>
<textarea name="my-xml-editor" data-editor="xml" data-gutter="1" rows="15"></textarea>
<br>
<textarea name="my-markdown-editor" data-editor="markdown" data-gutter="0" rows="15"></textarea>

billynoah
źródło
3
Wysoce rekomendowane. Bardzo elastyczny i czysty!
aaandre
5
Jedyną modyfikacją, jaką wprowadziłem w powyższym kodzie, jest zmiana textarea.css ('widoczność', 'ukryty'); do textarea.css ('display', 'none'); w przeciwnym razie na ekranie
pojawiało
@NickGoloborodko - kilka lat spóźniony, ale zgadzam się i odpowiednio zaktualizowałem odpowiedź. Naprawiono również link asa, aby fragment działał ponownie.
billynoah
@billynoah Użyłem tego kodu, ale mam puste miejsce, którego nie można edytować. Jak mogę to naprawić? Dzięki
bleyk
nie mam pojęcia, najwyraźniej nie użyłeś tego kodu dokładnie tak, jak jest lub działałby - tak jak robi to fragment kodu. jeśli potrzebujesz pomocy w debugowaniu, powinieneś rozpocząć nowe pytanie.
billynoah
8

Możesz mieć wielu edytorów asów. Po prostu nadaj każdemu obszarowi tekstów identyfikator i utwórz Edytor asów dla obu IDS w następujący sposób:

<style>
#editor, #editor2 {
    position: absolute;
    width: 600px;
    height: 400px;
}
</style>
<div style="position:relative; height: 450px; " >
&nbsp;
<div id="editor">some text</div>
</div>
<div style="position:relative; height: 450px; " >
&nbsp;
<div id="editor2">some text</div>
</div>
<script src="ace.js" type="text/javascript" charset="utf-8"></script>
<script src="theme-twilight.js" type="text/javascript" charset="utf-8"></script>
<script src="mode-xml.js" type="text/javascript" charset="utf-8"></script>
<script>
window.onload = function() {
    var editor = ace.edit("editor");
    editor.setTheme("ace/theme/twilight");
    var XmlMode = require("ace/mode/xml").Mode;
    editor.getSession().setMode(new XmlMode());

    var editor2 = ace.edit("editor2");
    editor2.setTheme("ace/theme/twilight");
    editor2.getSession().setMode(new XmlMode());

};
</script>
Breck
źródło
1

Aby stworzyć edytor, po prostu wykonaj:

HTML:

<textarea id="code1"></textarea>
<textarea id="code2"></textarea>

JS:

var editor1 = ace.edit('code1');
var editor2 = ace.edit('code2');
editor1.getSession().setValue("this text will be in the first editor");
editor2.getSession().setValue("and this in the second");

CSS:

#code1, code2 { 
  position: absolute;
  width: 400px;
  height: 50px;
}

Muszą być wyraźnie ustawione i dopasowane do rozmiaru. Wydaje mi się, że przez show () i hide () odnosisz się do funkcji jQuery. Nie jestem pewien, jak dokładnie to robią, ale nie może modyfikować miejsca, które zajmuje w DOM. Ukrywam się i pokazuję za pomocą:

$('#code1').css('visibility', 'visible');
$('#code2').css('visibility', 'hidden');

Jeśli użyjesz właściwości css „display”, to nie zadziała.

Sprawdź wiki tutaj, aby dowiedzieć się, jak dodawać motywy, tryby itp ... https://github.com/ajaxorg/ace/wiki/Embedding---API

Uwaga: nie muszą to być pola tekstowe, mogą to być dowolne elementy.

Konstabl
źródło
8
Tylko nie. Jeśli wywołasz ace.edit('code1'), otrzymasz śmieci takie jak: <textarea class="ace_editor ace-twilight ace_focus"><div class="ace_gutter">...</textarea>Innymi słowy, ace.edit próbuje wepchnąć się do obszaru tekstowego i nie jest to zbyt miłe.
Ciantic
0

Dla każdego takiego jak ja, który chce tylko minimalnego, działającego przykładu użycia Ace z CDN:

<!DOCTYPE html>
<html lang="en">

<body style="margin:0">
  <div id="editor">function () { 
  console.log('this is a demo, try typing!')
}
  </div>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.01/ace.js" type="text/javascript" charset="utf-8"></script>
  <script>
    var editor = ace.edit("editor");
    editor.setTheme("ace/theme/monokai");
    editor.getSession().setMode("ace/mode/javascript");
    document.getElementById("editor").style.height = "120px";
  </script>
</body>

</html>

Nic Scozzaro
źródło
Widzę, że ktoś został odrzucony ... czy to nie zadziałało?
Nic Scozzaro