无法用transact更新状态!在Om

时间:2015-06-26 03:12:40

标签: reactjs clojurescript om

om-cookbook 本地状态示例中,我可以使用update-state更新计数器!和set-state!,但不是与transact!

我使用栗子模板初始化项目。

(def app-state (atom {:button-presses 0}))

这些工作

(defn clicks [data owner]
  (om/update-state! owner [:button-presses] inc))

(defn clicks [data owner]
  (let [value (om/get-state owner :button-presses)]
    (om/set-state! owner :button-presses (inc value))))

这不起作用

(defn clicks [data owner]
  (om/transact! data :button-presses inc))

来自IRenderState的电话

om/IRenderState
    (render-state [_ state]
              (dom/div nil
                       (dom/button #js
                                   {:onClick #(clicks data owner)}
                                   "Click Moi")
                       (dom/br nil)
                       (dom/p nil
                              (str "Button Presses: " (:button-presses state)))))))

2 个答案:

答案 0 :(得分:0)

您混淆了应用程序状态和组件的状态。请注意update-state!set-state!如何将owner(组件)作为参数,而transact!update!采用cursor

(defn clicks [data owner]
  (om/transact! data :button-presses inc))

您的上述示例实际上对光标(data)起作用,而不是状态,但您的IRenderState实现正在组件的状态中查找:button-presses。如果您将(:button-presses state)更改为(:button-presses data),一切都应该没问题。

答案 1 :(得分:0)

根据Om Dcumentation,您正在使用transact!并传递一个函数但不是一个应用于旧状态的函数。 你可以做一个

(defn clicks [data owner] (om/transact! data :button-presses #(apply inc %))

或只是(partial inc),它会期望值传入。

另外作为旁注,交易的唯一区别!并更新!是更新!忽略参数(光标的旧值)