Warum ist der Zähler in der Kindkomponente Aktualisierung gut, wenn ichcore.async pub/sub verhält sich in Om (clojurescript) ungerade
(om/update-state! owner :clicked not)
und nicht dazu äußern, wenn ich es in der übergeordneten Komponente im Code Kommentar- unten ? Der Zähler wird aktualisiert, indem Sie auf die Schaltfläche klicken.
Was ich versuche zu erreichen ist ein Pub/Sub-Mechanismus, so dass Komponenten Nachrichten in einer entkoppelten Art und Weise austauschen können.
Sie können es replizieren, indem Sie ein neues Projekt zu machen mit:
lein new mies-om om-channel-test
Dann core.cljs mit folgenden Code ersetzen und
lein cljsbuild auto
Besuchen Sie die Seite index.html in einem modernen Browser laufen (zum Beispiel das neueste Chrome).
Der Code:
(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}})
Diese Frage wurde beantwortet auf der Clojurescript Google Gruppe: https://groups.google.com/forum/#!topic/clojurescript/5rCTnnulNXI –
können Sie sich dann selbst beantworten :) – zarkone