Я пытаюсь внедрить CodeMirror на свою веб-страницу, чтобы редактировать несколько фрагментов кода по одному за раз.ClojureScript: как сменить CodeMirror на реагент с Reagent
Для этого I:
- Have один атом Реагент
node-defs-atom
, содержащий карту фрагментов кода. - Have a another atom
node-history-atom
который содержит отображаемые ключи от фрагментов кода. - Задайте значение CodeMirror значению кодовой карты на ключ.
Вот что не работает:
(defn editor [node-defs-atom node-history-atom]
(reagent/create-class
{:reagent-render (fn [] (do [:textarea
{ :value (@node-defs-atom (last @node-history-atom))
:auto-complete "off"}]))
:component-did-mount (editor-did-mount node-defs-atom node-history-atom)
}))
(defn editor-did-mount [node-defs-atom node-history-atom]
(fn [this]
(let [codemirror (.fromTextArea js/CodeMirror
(reagent/dom-node this)
#js {:mode "clojure"
:lineNumbers true})]
......)))
Изменение node-history-atom
с reset!
ничего к тексту в CodeMirror не делать. Я действительно не уверен, что происходит не так.
Если бы кто-нибудь мог мне сказать, где я должен указать ссылку на (@node-defs-atom (last @node-history-atom))
Буду очень признателен.
Заранее благодарен!
Спасибо так много; Мне удалось получить эту работу, но мне приходилось писать вызов .setValue для каждого раза, когда я хочу изменить текст, вместо того, чтобы это происходило в ответ на основе значения node-history-atom. Возможно ли, чтобы это произошло так? – Boyentenbi
Вы должны вызывать .setValue каждый раз, когда вы хотите назначить новое значение, потому что CodeMirror является сдержанным, и вы не хотите его создавать каждый раз, когда я полагаю. Но назначение можно легко выполнить с помощью '(reagent.ratom/run! (.setValue @ text-atom))' macro. – SerCe