0

我正在尝试与 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。

我该怎么做呢?

4

1 回答 1

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

上帝交易;我认为这已经结束,可以继续进行该项目。

于 2016-01-07T20:27:48.527 回答