Elm에 CodeMirror 포함
7659 단어 Elm
그렇다고 할 수 있었던 것이 이쪽.
이것만으로는 알기 어렵지만, 에디터는 제대로 Elm 안에 있습니다. 잘못 DOM을 만지면 Virtual DOM이 에러를 냅니다.
Elm 측 코드
#editor
요소를 CodeMirror로 초기화합니다. CodeMirror 특유의 사정으로는, 이 요소의 바로 뒤에 에디터의 요소가 삽입되기 때문에, 그 장소에 다른 요소는 두지 않게 합니다.view : Model -> Html Msg
view model =
div [ class "main" ]
[ div [ class "editor" ]
[ textarea
[ id "editor"
, style "display" "none"
, onInput Input
]
[ text "Hello, press `Ctrl+S` to see the result." ]
]
, pre [ class "result" ] [ text model.lastSaved ]
]
이 예에서는 초기화하기 전에 일순 더러운 textarea 가 보이지 않게 숨기고 있습니다만, 편집 버튼을 누르면 에디터로 전환하는 UI 에도 할 수 있을 것 같습니다.
흥미로운 점은
onInput
가 정상적으로 작동하는 것입니다. 텍스트를 동기화하는 것만으로는 Port조차 필요하지 않습니다.그렇다고는 해도, 이것만이라면 지루하지 않기 때문에 보존(
Ctrl+S
) 했을 때에 메세지를 받을 수 있도록(듯이) 해 봅니다.port save : (String -> msg) -> Sub msg
JavaScript 측 코드
에디터의 초기화만 조금 까다롭습니다. Elm으로 그려진 타이밍을 아는 방법이 없기 때문에 요소가 나올 때까지
setInterval
에서 기다리고 있습니다. 뭐 이것이라고 실패했을 때에 무한 루프 해 버리므로, 제대로 쓴다면 좀 더 궁리가 필요할 것 같습니다만.var app = Elm.Main.init({
node: document.getElementById("app")
});
var initializer = setInterval(function () {
var textarea = document.getElementById("editor");
if (!textarea) {
return;
}
var editor = CodeMirror.fromTextArea(textarea, {
lineNumbers: true
});
editor.setOption("extraKeys", {
["Ctrl-S"]: function (cm) {
app.ports.save.send(editor.doc.getValue());
},
["Cmd-S"]: function (cm) {
app.ports.save.send(editor.doc.getValue());
}
});
clearInterval(initializer);
}, 10);
단축키로 저장하면 Elm 측에 메시지를 보내도록 하고 있습니다. 편의를 위해 텍스트를 보내고 있습니다만,
onInput
로 이미 취득하고 있으므로 실은 없어도 됩니다.감상
더 트래블할까 생각했는데, 실제로는 의도적으로 에러를 일으킬 때까지는 평온 무사했습니다. 에디터나 그 조상의 요소를 지우면 다시 textarea로 돌아간다는 트러블이 있습니다만, 실제로는 그렇게 퐁퐁 초기화를 반복하는 앱은 아마 별로 없다고 생각하기 때문에, 거기까지 걱정할 필요도 없다 안녕하세요.
앞으로는 WebComponents를 사용하면 더욱 스마트하게 할 수 있을 것입니다. 관심이 있으시면 선구자 동영상을 참조하십시오.
Reference
이 문제에 관하여(Elm에 CodeMirror 포함), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jinjor/items/3ebeb56702b11685b0df텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)