爲什麼在子組件計數器更新很好,當我評論core.async的pub/sub表現在庵(clojurescript)奇
(om/update-state! owner :clicked not)
而不是當我在代碼中取消註釋就出現在父組件的下方? 通過單擊按鈕更新計數器。
我想要完成的是一個pub/sub機制,所以組件可以以分離的方式交換消息。
您可以通過一個新的項目,將它複製:
lein new mies-om om-channel-test
然後替換下面的代碼core.cljs和運行
lein cljsbuild auto
訪問index.html頁面在一個現代瀏覽器(例如最新的Chrome)。
的代碼:
(ns om-channel-test.core
(:require-macros [cljs.core.async.macros :refer (go)])
(:require [om.core :as om :include-macros true]
[om.dom :as dom :include-macros true]
[cljs.core.async :refer [chan pub <! sub >! timeout put!]]))
(enable-console-print!)
(def app-state (atom {:text "Hello world!"}))
(def event-ch (chan))
(def event-pub
(pub event-ch #(:topic %)))
(defn child [cursor owner]
(reify
om/IInitState
(init-state [_]
{:counter 0})
om/IWillMount
(will-mount [_]
(go (loop [] (<! (om/get-state owner :subscriber))
(println "message received")
(om/update-state! owner :counter inc)
(recur))))
om/IRender
(render [_]
(println "rendering child")
(dom/p nil (om/get-state owner :counter)))
om/IWillUnmount
(will-unmount [_]
(println "unmount"))))
(defn parent [cursor owner]
(om/component
(println "rendering parent")
(dom/div nil
(dom/button #js {:onClick
#(do
#_(om/update-state! owner :clicked not)
(go (>! event-ch {:topic :wizard
:message "hello"})))}
"Click")
(om/build child
cursor
{:init-state
{:subscriber
((om/get-shared owner :create-subscriber) :wizard)}}))))
(om/root
parent
app-state
{:target (. js/document (getElementById "app"))
:shared {:create-subscriber (fn [topic]
(sub event-pub
topic (chan)))
:event-ch event-ch}})
這個問題已經被在clojurescript谷歌組上回答:https://groups.google.com/forum/#!topic/clojurescript/5rCTfnulNXI – 2014-09-19 07:54:05
你可以自我回答:) – zarkone 2015-07-29 06:06:49