Próbujesz zareagować po raz pierwszy i chcę utworzyć prostą aplikację listy zadań do wykonania. Ale za każdym razem, gdy wciskam enter, aby wywołać onSubmit
, jest napisane: Uncaught Error: Cannot manipulate cursor outside of render phase, only om.core/transact!, om.core/update!, and cljs.core/deref operations allowed
. Chociaż myślę, że jest to bardzo dobry komunikat o błędzie, nie wiem, co robić.Nie można manipulować kursorem poza fazą renderowania.
(ns app.core
(:require [om.core :as om :include-macros true]
[sablono.core :as html :refer-macros [html]]))
(def app-state (atom
{:todos [{:todo "first"}
{:todo "second"}]
:current ""}))
(defn to-do
[data]
(om/component
(html [:li (:todo data)])))
(defn to-dos
[data]
(om/component
(html [:div
[:form {:on-submit (fn [e]
(.preventDefault e)
(om/transact! data :todos (fn [v]
(js/console.log (:current data))
(conj v (:current data)))))}
[:input {:type "text"
:placeholder "Enter some text."
:on-change (fn [e] (om/update! data :current (.. e -target -value)))}]]
[:ul
(om/build-all to-do (:todos data))]])))
(om/root to-dos app-state {:target js/document.body})
To jest absolutnie poprawne – Dan
Korzystanie '(: aktualny v)' jest znacznie korzystniejsze uzyskiwania dostępu do '@ data' kursorem ponownie. Jest jednak drugi problem z argumentem ': todos' dla' om/transcat! '. Zobacz moją odpowiedź poniżej. – prabhasp