2017-06-08 9 views
1

ビューが更新された後にCmdを実行する簡単な方法はありますか?特に、私はtextareaの特定のキー(Enterキーのような)が押された時にカーソルの位置を変えようとしています。私のupdate機能では私が持っている:Elmでビューの後にポートを呼び出す

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

マイsetCursorポートが呼び出され、対応するJavaScriptコードが正しくtextareasetSelectionRange関数を呼び出します。そしてそして Elmはtextareaの内容を更新する私のview関数を呼び出します。残念ながら、それは私のカーソル位置を拭き取ります。

textareaのコンテンツをの前に更新する必要があります。 JavaScriptポートにtextarea.setSelectionRange()を呼び出す前に。 setTimeoutに頼らずにこれを行う方法は、いつもうまくいかず、タイムアウト内で点滅する可能性がありますか?

答えて

0

これを行う標準的な方法は、次のティックで返すコマンドをトリガーすることです。 Date.now - そのメッセージからポートコマンドを起動します。ビュー機能が実行され、テキスト領域が存在するとみなされます。私の経験でも同様に動作しているようです

代替は、requestAnimationFrameのでsetTimeout(任意の間隔で)を置き換えることです:

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

viewがあまりにもレンダリングされた後にこれがトリガされます。

+0

Elmには、実際には 'requestAnimationFrame()'のための組み込みのサブスクリプション機能があります:http://package.elm-lang.org/packages/elm-lang/animation-frame/latest/AnimationFrame。私の懸案事項は、型付きキーは、最初の 'KeyboardEvent'と次のアニメーションフレームの間で登録/処理できるということでした。それはすべてを捨てるだろう。 –

関連する問題