第一次尝试反应,我想做一个简单的待办事项列表应用程序。但是每次我按enter来触发onSubmit时,它都说是Uncaught Error: Cannot manipulate cursor outside of render phase, only om.core/transact!, om.core/update!, and cljs.core/deref operations allowed。虽然我认为这是一个非常好的错误信息,但我不知道该怎么做。
(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})发布于 2014-07-03 12:57:26
我认为问题在于您在om/transact中访问data的位置!在那里您应该对v进行操作
(:current v)而不是(:current data)
或者您可以尝试使用(:current @data)来获取最近的数据值。
发布于 2015-04-19 03:45:24
实际上,有两个问题:
(om/transact! data :todos (fn [v]
(js/console.log (:current data))
(conj v (:current data)))))其中之一就是@edbond上面所说的:您应该使用(:current v)而不是(:current data)。但是,另一个问题是,您指定的是:todos关键字,因此您应该简单地更改data本身,因为:current在应用程序状态下位于:todos之外。因此,正确的表述是:
(om/transact! data (fn [v]
(js/console.log (:current v))
(conj v (:current v)))))https://stackoverflow.com/questions/24548626
复制相似问题