3

私はClojureScriptとOmに入ろうとしています。私がぐるぐる回っている特定のケースがあります。

キーなしで最初にレンダリングされるコンポーネントがあります。

(defn model-view [data owner]
  (reify
    om/IWillMount
    (will-mount [_]
      (om/transact! data [:stats] (fn [] {}))
      (go
        (let [response ((<! (api/get-stats (data :id))) :body)
              stats (:stats response)]
          (om/update! data [:stats] stats))))
    om/IRender
    (render [_]
      (dom/div nil
               (dom/h3 nil (data :title))
               ;; Here I want to use the :stats key in data that I
               ;; queried for in IWillMount, but its not present
               ;; the first time this model is rendered. It's only present
               ;; AFTER IWillMount has ran.
               (om/build model-stats-view (data :stats)))))

このコンポーネントが初めて呼び出されたとき、:statsキーは単純に に存在しませんdata。そのため、統計を取得するために API 呼び出しを行います。しかし、React は引き続きrender関数を呼び出すため、コンポーネントがクラッシュします。

dataと呼ばれる空のマップを提供するこのコンポーネントの初期状態を設定して、呼び出しで:statsレンダリングしようとするのを防ぐにはどうすればよいですか?nil(om/build model-stats-view)

4

1 に答える 1

1

私はすべての初期化を init-state で行い、次に render-state でアクセスすることを好みます。そして、私は自分のマウントにゴーループを入れました。go-loop で init-state (つまり :e-map) を更新すると、コンポーネントのレンダリング/再レンダリングの呼び出しが強制されます。コンポーネント間/コンポーネント内メッセージングのために、すべてのコンポーネントでこれを使用します。pub/sub チャネルに何かをプッシュするだけで、レースに出かけることができます。

;To update my state I use a function:

(defn set-owner-state! [owner old-map-key old-map new-map]
   (om/set-state! owner {old-map-key (merge old-map new-map)}))

om/IInitState
(init-state [_]
  (println "queue->init-state")
  {:e-map {:active-fsm nil}})

om/IDidMount
(did-mount [_]
    (go-loop []
        (let [[v _] (alts! [server-fsm-events dispatcher-events])
              current-state (om/get-state owner)
              e-map (:e-map current-state)]
        ; what goes in here is the logic to respond to a message
        ; in my case I have a match, it could be a cond or a set of
        ; if's.
        (set-owner-state! owner :e-map e-map {:active-fsm :active :task-paths nil})
    ...

om/IRenderState
(render-state [_ {:keys [e-map]}]
  (println "e-map:" e-map)
  ...
于 2015-10-30T13:01:46.430 に答える