Skip to content

Instantly share code, notes, and snippets.

@prbroadfoot
Created November 22, 2015 18:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save prbroadfoot/b8801772d2a41409ef86 to your computer and use it in GitHub Desktop.
Save prbroadfoot/b8801772d2a41409ef86 to your computer and use it in GitHub Desktop.
(ns om-tutorial.core
(:require [goog.dom :as gdom]
[om.next :as om :refer-macros [defui]]
[om.dom :as dom]))
(def app-state (atom {:message "Original message"}))
(defn read [{:keys [state] :as env} key params]
(let [st @state]
(if-let [[_ value] (find st key)]
{:value value}
{:value :not-found})))
(defn mutate [{:keys [state] :as env} key params]
(if (= 'reset-message key)
{:value {:keys [:message]}
:action #(swap! state assoc :message "New message")}
{:value :not-found}))
(defui SubComponent
Object
(componentWillMount [this]
(om/set-state! this {:have-clicked-button false}))
(render [this]
(let [{:keys [reset-message-fn]} (om/get-computed this)
{:keys [have-clicked-button]} (om/get-state this)]
(dom/div nil
(dom/p nil (str "Have clicked button: " have-clicked-button))
(dom/button
#js {:onClick #(do
(reset-message-fn)
;; App does not re-render "New message"
;; unless you comment out the next sexp,
;; in which case it will.
(om/update-state! this assoc :have-clicked-button true)
;; Is it possible to re-render "New message" *and*
;; update local state when clicking the button?
)}
"Reset message")))))
(def sub-component (om/factory SubComponent))
(defui App
static om/IQuery
(query [this]
[:message])
Object
(render [this]
(let [{:keys [message]} (om/props this)]
(dom/div nil
message
(sub-component
(om/computed
{}
{:reset-message-fn #(om/transact! this '[(reset-message)])}))))))
(def reconciler
(om/reconciler
{:state app-state
:parser (om/parser {:read read :mutate mutate})}))
(om/add-root! reconciler
App (gdom/getElement "app"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment