我正在尝试使用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,如果这是有道理的。
我该怎么做?
答案 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)))))
上帝交易;我认为这是关闭的,可以继续项目。