om尝试使用om / transact更新向量时出现ClojureScript引用游标错误

时间:2014-12-07 15:35:31

标签: clojure reactjs clojurescript cursors om

我在尝试更新游标时看到以下错误:

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指向应用程序状态中的comments-data向量:

(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))))

现在,当用户通过输入组件中的输入提交一些数据时,我想更新此光标。我使用(让[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时!打电话我看到上面的错误。

2 个答案:

答案 0 :(得分:1)

您想调用comments函数并使用其返回值(光标),而不是使用函数本身。改变这一行:

 (let [foo (->> comments)]

为:

 (let [foo (->> (comments))]

这应该适合你。

答案 1 :(得分:1)

更改

(let [foo (->> comments)]

(let [foo (comments)]

并保持简单。不需要->>运算符。