2

om-cookbook的本地状态示例中,我可以使用 update-state 更新计数器!和设置状态!,但不是交易!

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

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

2 回答 2

0

您混淆了应用程序状态和组件状态。注意如何将(组件)作为参数,而将update-state!光标作为参数set-state!ownertransact!update!

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

您上面的示例实际上作用于光标 ( data),而不是状态,但您的IRenderState实现正在查找:button-presses组件的状态。如果你改变(:button-presses state)一切(:button-presses data)应该没问题。

于 2015-07-06T06:46:13.937 回答
0

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

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

或者只是(partial inc)期望值被传入。

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

于 2018-02-22T13:40:00.753 回答