尝试更新游标时看到以下错误:
Uncaught Error: No protocol method ITransact.-transact! defined for type function: function comments(){return om.core.ref_cursor.call(null,new cljs.core.Keyword(null,"comments-data","comments-data",1871210833).cljs$core$IFn$_invoke$arity$1(om.core.root_cursor.call(null,cljs_playground.core.app_state)));
我正在使用 ref-cursor 指向我的应用程序状态中的注释数据向量:
(def app-state
(atom
{:comments-data [{ :author "Commenter 1" :text "comment 1" }
{ :author "Commenter 2" :text "comment 2" }]}))
(defn comments []
(om/ref-cursor (:comments-data (om/root-cursor app-state))))
现在,当用户通过我的输入组件中的输入提交一些数据时,我想更新这个光标。我使用 (let [foo (->> comments)] 来引用渲染状态中的光标。我将它传递给处理用户提交的函数调用,我想简单地向这个向量添加一个项目。
(defn handle-submit [e owner {:keys [text]} foo]
(om/transact! foo #(concat % {:author "foo" :text "bar"}))
(om/set-state! owner :text ""))
(defn Input
[data owner]
(reify
om/IInitState
(init-state [_]
{:text nil})
om/IRenderState
(render-state [this state]
(let [foo (->> comments)]
(dom/div nil
(dom/input #js
{ :type "text"
:ref "text-field"
:value (:text state)
:onChange (fn [event] (handle-change event owner state))})
(dom/button #js
{ :onClick (fn [event] (handle-submit event owner state foo))} "submit"))))))
但是,当我进行 om/transact! 打电话给我看到上面的错误。