Skip to content

Instantly share code, notes, and snippets.

@stijlist
Last active May 30, 2016 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stijlist/53b420fb1647070b78ee001687fb0de1 to your computer and use it in GitHub Desktop.
Save stijlist/53b420fb1647070b78ee001687fb0de1 to your computer and use it in GitHub Desktop.
2nd om/transact! not causing a re-render
(ns enough.core
(:require
[goog.dom :as dom]
[om.next :as om :refer-macros [defui]]
[sablono.core :refer-macros [html]]))
(enable-console-print!)
(defmulti read om/dispatch)
(defmulti mutate om/dispatch)
(def init-data
{:parameters [[:parameters/by-name "Salary"]]
:parameters/by-name {"Salary" {:name "Salary" :value 1 :editing? false}}})
(defn get-normalized-toplevel-key [state key]
(let [s @state]
(into [] (map (partial get-in s) (get s key)))))
(defmethod read :default
[{:keys [state]} key params]
{:value (get-normalized-toplevel-key state key)})
(defmethod mutate 'parameters/update
[{:keys [state]} key {:keys [name] :as params}]
{:action
(fn []
(swap! state update-in [:parameters/by-name name] (fn [old] (merge old params))))})
(def parser (om/parser {:read read :mutate mutate}))
(def reconciler (om/reconciler {:state init-data :parser parser}))
(defui Parameter
static om/Ident
(ident [this {:keys [name]}]
[:parameters/by-name name])
static om/IQuery
(query [this]
[:name :value :editing?])
Object
(render [this]
(let [{:keys [name value editing?]} (om/props this)]
(prn "re-render Parameter")
(html
[:div nil
[:button
{:onClick #(om/transact! this '[(parameters/update {:name "Salary" :value 1 :editing? true})])}
"Edit"]
[:div name]
(if editing?
[:div
[:input {:type "text"}]
[:button {:onClick #(om/transact! this '[(parameters/update {:name "Salary" :value 5 :editing? false})])}]]
[:div value])]))))
(def parameter (om/factory Parameter {:keyfn :name}))
(defui Root
static om/IQuery
(query [this]
'[:parameters])
Object
(render [this]
(html
[:div nil (map parameter (:parameters (om/props this)))])))
(om/add-root! reconciler Root (dom/getElement "app"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment