Этот вопрос лучше всего пояснить на примере:
;; create a basic om app.
lein new mies-om om-tut
lein cljsbuild auto.
Затем вставьте следующий код (в core.cljs
)
(ns om-tut.core
(:require [om.core :as om :include-macros true]
[om.dom :as dom :include-macros true]))
(def app-state (atom {:text "Hello world!"}))
(om/root
(fn [app owner]
(reify
om/IWillMount
(will-mount [_]
(om/update! app :text "Success!!!"))
om/IRender
(render [_]
(dom/div nil (app :text ))
)))
app-state
{:target (. js/document (getElementById "app"))})
Код в will-mount
на самом деле выполняется, если вы добавите функцию println
, то увидите это. Что непонятно, так это почему цикл рендеринга вызывается только один раз. С другой стороны, если вы поместите om/update!
в блок go
, он будет работать так, как ожидалось:
;; add [org.clojure/core.async "0.1.346.0-17112a-alpha"] to your deps in project.clj
(ns om-tut.core
(:require-macros [cljs.core.async.macros :refer [go]])
(:require [om.core :as om :include-macros true]
[cljs.core.async :refer [put! chan <! to-chan close!]]
[om.dom :as dom :include-macros true]))
(def app-state (atom {:text "Hello world!"}))
(om/root
(fn [app owner]
(reify
om/IWillMount
(will-mount [_]
(go
(om/update! app :text "Success!!")))
om/IRender
(render [_]
(dom/div nil (app :text )))))
app-state
{:target (. js/document (getElementById "app"))})
Вопрос: почему will-mount
не запускает новый цикл рендеринга, так как я обновляю состояние приложения? Мне нравится использовать go
блоков, когда они мне нужны, но я не понимаю, почему я вынужден заключать этот простой пример в блок.
[om "0.8.0-beta3"]
и совершите сделку! курсор внутри will-mount я получаю старое значение. однако это не так, если я переключусь на[om "0.7.3"]
Тот же самый код послеlein cljsbuild clean
отобразит новое значение. - person cedric   schedule 13.12.2014