我正在尝试与 Om 一起玩(是的,我知道 om.next 即将到来,但尚不清楚它何时会准备好——我认为基本想法将适用),但遇到了一个简单的(或应该是) 问题。
我有一个带有选择小部件的组件,该小部件从我的应用程序状态的“效果”成员中填充,以及一个用于向下游发送该效果的按钮(控制 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"))))))
实际上到目前为止还不错;这主要有效。当应用程序状态填充有 :effects (通过 REST 调用)时,这确实填充了选项。
问题是那个讨厌的:selected-effect
国家成员。它最初是 nil,但是一旦填充了 select 元素,选择器就会显示第一个元素。因此,如果用户单击“发送效果”按钮,而不是获得第一个效果,它会发送“nil”——因为“选项”子项已正确填写,但视图状态没有改变。
当我在全局状态下更改效果列表时:selected-effect
,如果当前值无效(换句话说,它开始在nil
并且我填充了效果 A、B 和 C——它应该将选定的值更改为“A”......如果我然后填充效果 A、C 和 D,它应该保持 A,但如果我填充B、C、D,如果有意义的话,它应该切换到 B。
我该怎么做呢?