Чтение ввода с Om Next
Я пытаюсь понять, как читать состояние из текстового поля в om.next
, Насколько я понимаю, мы больше не связаны / должны использовать core.async
,
В качестве небольшого примера рассмотрим запись в текстовом поле и привязку его к элементу абзаца, чтобы вводимый вами текст автоматически отображался на экране.
(def app-state (atom {:input-text "starting text"}))
(defn read-fn
[{:keys [state] :as env} key params]
(let [st @state]
(if-let [[_ v] (find st key)]
{:value v}
{:value :not-found})))
(defn mutate-fn
[{:keys [state] :as env} key {:keys [mytext]}]
(if (= 'update-text key)
{:value {:keys [:input-text]}
:action
(fn []
(swap! state assoc :input-text mytext))}
{:value :not-found}))
(defui RootView
static om/IQuery
(query [_]
[:input-text])
Object
(render [_]
(let [{:keys [input-text]} (om/props _)]
(dom/div nil
(dom/input
#js {:id "mybox"
:type "text"
:value input-text
:onChange #(om/transact! _ '[(update-text {:mytext (.-value (gdom/getElement "mybox"))})])
})
(dom/p nil input-text)))))
Это не работает
При запуске события onChange в
input
форма, выражение в кавычках не захватывает текст из коробки.Первая мутация запускается и обновляется, но затем последующие мутации не запускаются. Даже если состояние не изменилось, запрос должен прочитать строку из
app-state
и заставить текст быть таким же?
1 ответ
Я бы сделал :onChange
Событие выглядит так:
:onChange (fn (_)
(let [v (.-value (gdom/getElement "mybox"))]
#(om/transact! this `[(update-text {:mytext ~v})])))
Здесь значение v
на самом деле будет проходить. Но также om/transact!
нужен либо компонент, либо согласователь, чтобы передать его в качестве первого параметра. Здесь я прохожу в this
который будет корневым компонентом.