2015-10-28 24 views
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空映射,從而防止試圖呈現在(om/build model-stats-view)呼叫nil設置一個初始狀態?

+1

你可以使用'(get data:stats {})'? – cfrick

+0

@cfrick工作。謝謝。但是我會留下來看看是否有更多類似「類似React」的解決方案或者IInitState或其他東西。 – tolgap

回答

1

我更喜歡在初始化狀態下完成所有的初始化,然後在渲染狀態下訪問它。我在我的安裝架上放了一個循環迴路。當你在循環中更新init-state(即:e-map)時,它強制調用渲染/重新渲染組件。我在我的所有組件中都使用它來實現組件間/組件內消息傳遞。只需將某些東西推入酒吧/分頻道,我們就可以參加比賽。

;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) 
    ... 
+0

你的文本解釋很不錯,它讓我弄清楚我做錯了什麼。但是你的代碼示例太模糊了。我會接受你的回答,但我希望你的代碼示例能夠真實地顯示你如何修改:這裏的電子地圖。 – tolgap