Last active
May 30, 2016 16:39
-
-
Save stijlist/53b420fb1647070b78ee001687fb0de1 to your computer and use it in GitHub Desktop.
2nd om/transact! not causing a re-render
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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