Я пытаюсь играть с Om (да, я знаю, om.next идет, но не ясно, когда он будет готов - и я думаю, что основная идея будет применяться), но столкнулись с простым (или должна быть) проблема.Как обновить состояние компонента Om после состояния приложения?
У меня есть компонент с выбора виджета, который заполняет из «эффектов» член моего приложения-состояния, и кнопку, чтобы отправить этот эффект вниз (управление светодиодными полосками):
(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"))))))
Хорошо до сих пор на самом деле; это в основном работает. Когда в состоянии приложения заполняются: эффекты (через вызов REST), это действительно заполняет параметры.
Проблема в том, что надоедливый :selected-effect
государственный член. Первоначально он равен нулю, но как только элемент выбора заполняется, селектор отображает первый элемент. Поэтому, если пользователь нажимает кнопку «Отправить эффект», вместо того, чтобы получать первый эффект, он отправляет «ноль» - потому что дети «опции» заполняются правильно, но состояние представления не изменилось.
Когда я изменяю список эффектов в глобальном состоянии, я хотел бы, чтобы значение селектора (:selected-effect
) в представлении изменилось на первый элемент в списке, если текущее значение недействительно (в другими словами, он начинается с nil
, и я заполняю эффектами A, B и C - он должен изменить выбранное значение на «A» ... если я затем заполню эффектами A, C и D, он должен остаться A , но если я заселена B, C, D, он должен затем перейти к B, если это имеет смысл.
Как мне это сделать?