транзакционное состояние приложения в will-mount не влияет

Этот вопрос лучше всего пояснить на примере:

;; 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 блоков, когда они мне нужны, но я не понимаю, почему я вынужден заключать этот простой пример в блок.


person shaft    schedule 12.12.2014    source источник
comment
Также заметил это, и кажется, что это как-то связано с версией om, которую вы используете. [om "0.8.0-beta3"] и совершите сделку! курсор внутри will-mount я получаю старое значение. однако это не так, если я переключусь на [om "0.7.3"] Тот же самый код после lein cljsbuild clean отобразит новое значение.   -  person cedric    schedule 13.12.2014
comment
Этот вопрос обсуждается на github github.com/omcljs/om/issues/336.   -  person cedric    schedule 09.04.2015


Ответы (1)


Он думает, что will-mount - не лучшее место для обновления курсора. Вызов om/build с опцией :fn сделает то, что вы пытаетесь достичь.

Компонент визуализируется только один раз с обновленным курсором.

(om/build mycomponent data {:fn #(assoc % :text "Success !")})

https://github.com/swannodette/om/wiki/Documentation#build

person cedric    schedule 22.01.2015