2017-06-08 5 views
1

Gibt es eine einfache Möglichkeit, eine Cmd auszuführen, nachdem die Ansicht aktualisiert wurde? Insbesondere versuche ich, den Cursor in einer textarea um bestimmte Tasten (wie die Eingabetaste) gedrückt zu werden. In meiner update Funktion habe ich:Aufruf eines Ports, nachdem die Ansicht in Elm aktualisiert wurde

case keyboardEvent.key of 
    "Enter" -> 
     (modelAfterEnterPressed model keyboardEvent.selectionStart, setCursor model.cursor) 
    "Tab" -> 
     .... 

Mein setCursor Port genannt wird und die entsprechenden Aufrufe von JavaScript-Code der textarea ‚s setSelectionRange richtig funktionieren. Und dann Elm ruft meine view Funktion, die den Inhalt textarea aktualisiert. Leider löscht das meine Cursorposition.

ich für die textarea ‚s Inhalt muß aktualisiert werden, bevortextarea.setSelectionRange() in meinem JavaScript Hafen anlaufen. Eine Möglichkeit, dies zu tun, ohne auf setTimeout zurückgreifen, die möglicherweise nicht immer funktioniert und kann Blitze innerhalb der Zeitüberschreitung verursachen?

Antwort

0

Der Standard Weg dies zu tun ist, einen Befehl auszulösen, der im nächsten Tick zurückkehrt - z. Date.now - und dann den Port-Befehl von dieser Nachricht auslösen. Das garantiert, dass die Ansichtsfunktion ausgeführt wurde und Ihr Textbereich vorhanden ist.

Eine Alternative, die auch in meiner Erfahrung zu funktionieren scheint, ist ein setTimeout (mit einem beliebigen Intervall) mit einem request zu ersetzen:

nach den zu
elm.ports.selectText.subscribe(() => { 
    requestAnimationFrame(() => { 
    var textarea = document.querySelector(...); 
    textarea.setSelectionRange(); 
    }); 
}); 

view gemacht wurde Dies wird ausgelöst.

+0

Elm hat tatsächlich eine integrierte Subskriptionsfunktion für 'requestAnimationFrame()': http://package.elm-lang.org/packages/elm-lang/animation-frame/latest/AnimationFrame. Meine Sorge war, dass typisierte Schlüssel zwischen dem ersten 'KeyboardEvent' und dem nächsten Animationsrahmen registriert/verarbeitet werden könnten. Das würde alles wegwerfen. –

Verwandte Themen