应用程序状态后如何更新Om组件状态?

时间:2016-01-06 21:39:09

标签: om

我正在尝试使用Om(是的,我知道om.next即将到来,但目前还不清楚它何时会准备好 - 我认为基本的想法会适用),但是遇到了简单的问题(或应该是)问题。

我有一个带有select小部件的组件,该小部件从我的app-state的“effects”成员填充,还有一个用于向下游发送该效果的按钮(控制LED条带):

(defn effect-view [data owner]
  (reify
    om/IInitState
    (init-state [_]
      {:selected-effect nil})
    om/IRenderState
    (render-state [this state]
      (dom/div {}
               (dom/select #js {:id "effect"
                                :value (:selected-effect state)
                                :onChange #(handle-change % owner state)}
                           (for [effect (:effects data)]
                             (dom/option {:react-key (:name effect)} (:name effect))))
               (dom/button #js {:id "send-effect"
                                :onClick (fn [e]
                                           (queue-command "effect" (:selected-effect state)))
                                :react-key "send-effect"}
                           (str "Send Effect"))))))

实际到目前为止好;这主要是有效的。当app-state填充:effects(通过REST调用)时,这确实填充了选项。

问题是那个讨厌的:selected-effect州议员。它最初是nil,但是一旦填充了select元素,选择器就会显示第一个元素。因此,如果用户单击“发送效果”按钮,而不是获得第一个效果,则发送“nil” - 因为“选项”子项正在被正确填充但视图状态没有更改。

当我在全局状态下更改效果列表时,我希望视图中的选择器(:selected-effect)的值更改为列表中的第一项,如果当前值不是有效(换句话说,它从nil开始,我用效果A,B和C填充 - 它应该将所选值更改为“A”...如果我然后填充效果A,C,和D,它应该保持A,但如果我填充B,C,D,它应该切换到B,如果这是有道理的。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

解决!通过......更接近阅读文档。叹息。

在实际设置下一个道具(应用程序状态)之前调用IWillReceiveProps协议。因此,以下设置渲染之前的组件状态。在om/IRenderState之前添加此代码时,代码似乎可以执行我想要的操作:

om/IWillReceiveProps
(will-receive-props [this next-props]
  (let [effect-names (map :name (:effects next-props))]
    (if-not (contains? effect-names (om/get-state owner :selected-effect))
      (om/set-state! owner :selected-effect (first effect-names)))))

上帝交易;我认为这是关闭的,可以继续项目。