2017-05-15 1 views
0

[Der ursprüngliche Titel war: Aktionen von der Tastatur in Ace Editor verhindern, aber sie fangen]Wie kann man vermeiden, dass editor.getSession(). (...) ein Änderungsereignis auslöst?

Ich benutze Ace Editor, um eine Echtzeit-Collaboration-Plattform zu erstellen. Ich fand Fragen mehr oder weniger ähnlich zu meinen here oder there, aber keine von ihnen sind für meinen Fall geeignet.

Es ist diese Veranstaltung, die ein Problem verursacht, wenn mehrere Benutzer zu schreiben:

editor.getSession().on('change', function(e) { 
    // action = e.action 
    // newString = e.lines 
    // index = editor.session.doc.positionToIndex(editor.selection.getCursor()) 
} 

Wenn der Benutzer etwas (keypress Ereignis) ich die Aktion fangen will einzugeben, wird der Inhalt hinzugefügt oder entfernt werden, und der Index des Cursors (nicht (row, col)). Das Einfügen oder Löschen sollte bei diesem Schritt verhindert werden. Diese drei Parameter sollten die Eingänge der Funktion sendDelta(action, string, index) sein.

Zur Vereinfachung sollte die Funktion sendDelta(action, string, index)insertDelta(action, string, index) aufrufen, die für das Einfügen zuständig ist. Diese Einfügung sollte das Ereignis jedoch nicht für die Inhaltsänderung aktivieren.

Zusammenfassend möchte ich nur das erfassen, was von der Tastatur kommt, nicht die Einfügungen über die Funktion insertDelta(action, string, index).

EDIT

Als @a_user vorgeschlagen, ich glaube, das Design meiner Anwendung keinen Sinn macht. Ich möchte also eine Frage stellen, die der ersten sehr ähnlich ist.

Nehmen wir an, ich habe eine Funktion changeFromServer(action, string, index), die die Informationen aus dem Netzwerk empfängt und die Änderungen anwendet. Dann würde die Einfügung das Ereignis bei Änderung auslösen, das die Information an das Netzwerk zurücksendet. Dies würde eine Endlosschleife erzeugen.

Ich bin nicht sicher, ob meine Erklärungen klar waren oder nicht. Wenn nicht, this user hatte das gleiche Problem als ich und seine Beschreibung sieht besser aus als meine. Übrigens verstehe ich die dort gegebene Antwort nicht.

+0

, wenn Sie das Änderungsereignis zu verhindern, werden viele Dinge falsch sein, zum Beispiel Cursorposition nach dem Einfügen, Gruppierung rückgängig machen, warum möchten Sie das verhindern? –

+0

Sie schreiben, ich ändere meine Frage etwas. –

Antwort

0

einen Flag verwenden zu wissen, wann Änderungsereignis von changeFromServer genannt wird

var fromServer = false 
function changeFromServer() { 
    fromServer = true 
    // call applyDelta here 
    fromServer = false 
} 
doc.on("change", function(e) { 
    if (fromServer) return; 
}) 
Verwandte Themen