Added :binding-invalidated lifecycle callback.

This commit is contained in:
Aaron Craelius 2014-11-21 17:34:33 -05:00
parent f1b0a51111
commit 6faf2b4efa

View file

@ -116,13 +116,13 @@
(dispose-node child-key state))))))) (dispose-node child-key state)))))))
(defn- remove-dom-node [dom-node] (defn- remove-dom-node [dom-node]
(time ;(println "removing dom node")
(let [state (aget element-state-lookup dom-node)] (let [state (aget element-state-lookup dom-node)]
(dispose-node dom-node state) (dispose-node dom-node state)
(when-let [parent (.-parentNode dom-node)] (when-let [parent (.-parentNode dom-node)]
(.removeChild parent dom-node) (.removeChild parent dom-node)
(when state (when state
(js-delete (.-parent-state state) state)))))) (js-delete (.-parent-state state) state)))))
(defn remove! [x] (defn remove! [x]
(if (dom-node? x) (if (dom-node? x)
@ -240,26 +240,26 @@
(when-let [[add-watch* remove-watch*] (r/get-add-remove-watch* ref)] (when-let [[add-watch* remove-watch*] (r/get-add-remove-watch* ref)]
(let [attr-state #js {:disposed false} (let [attr-state #js {:disposed false}
key [element attr-name] key [element attr-name]
f (fn on-value-ref-invalidated invalidate
([] (fn on-value-ref-invalidated
(on-value-ref-invalidated key ref)) ([]
([key ref _ _] (on-value-ref-invalidated key ref))
(on-value-ref-invalidated key ref)) ([key ref _ _]
([key ref] (on-value-ref-invalidated key ref))
(remove-watch* ref key) ([key ref]
(queue-animation (remove-watch* ref key)
(fn [_] (queue-animation
(when-not (.-disposed attr-state) (fn [_]
(add-watch* ref key on-value-ref-invalidated) (when-not (.-disposed attr-state)
(set-fn (non-reactively @ref)))))))] (add-watch* ref key on-value-ref-invalidated)
(set-fn (non-reactively @ref)))))))]
(register-with-parent-state node-state (register-with-parent-state node-state
(str "-" state-prefix "." attr-name) attr-state) (str "-" state-prefix "." attr-name) attr-state)
(add-watch* ref key f))) (add-watch* ref key invalidate)))
(set-fn @ref)) (set-fn @ref))
(defn- bind-style-prop! [element attr-name attr-value node-state] (defn- bind-style-prop! [element attr-name attr-value node-state]
(let [setter (fn [v] (let [setter (fn [v]
;(println "setting style" element attr-name v)
(set-style-prop! element attr-name v))] (set-style-prop! element attr-name v))]
(if (satisfies? cljs.core/IDeref attr-value) (if (satisfies? cljs.core/IDeref attr-value)
(bind-attr* setter element "style" attr-name attr-value node-state) (bind-attr* setter element "style" attr-name attr-value node-state)
@ -513,8 +513,13 @@
(set! (.-parent-state state) parent-state) (set! (.-parent-state state) parent-state)
(register-with-parent-state parent-state (get-node-id new-elem) state))))) (register-with-parent-state parent-state (get-node-id new-elem) state)))))
(defn- replace-node-completly [parent new-elem-spec cur-dom-node] (defn- replace-node-completely [parent new-elem-spec cur-dom-node top-level]
(let [new-elem (build-element new-elem-spec)] (let [new-elem
(if top-level
(do
;(println "build")
(build-element new-elem-spec))
(build-element new-elem-spec))]
(register-element-with-parent parent new-elem) (register-element-with-parent parent new-elem)
(.replaceChild parent new-elem cur-dom-node) (.replaceChild parent new-elem cur-dom-node)
(dispose-node cur-dom-node) (dispose-node cur-dom-node)
@ -546,24 +551,28 @@
;;vdom (normalize-virtual-element vdom) ;;vdom (normalize-virtual-element vdom)
] ]
(if (keyword-identical? (first vdom) (first cur-vdom)) (if (keyword-identical? (first vdom) (first cur-vdom))
(let [old-attrs? (second cur-vdom) (do
new-attrs? (second vdom) ;(println "diff hit" (first vdom))
new-attrs (when (map? new-attrs?) new-attrs?)] (let [old-attrs? (second cur-vdom)
(replace-attrs! cur-dom-node new-attrs? (second vdom)
(when (map? old-attrs?) old-attrs?) new-attrs (when (map? new-attrs?) new-attrs?)]
new-attrs) (replace-attrs! cur-dom-node
(when-not top-level (when (map? old-attrs?) old-attrs?)
(dispose-child-state (get-element-state cur-dom-node) "-reactive")) new-attrs)
(reset-element-spec! cur-dom-node vdom) (when-not top-level
(let [new-children (if new-attrs (nnext vdom) (next vdom)) (dispose-child-state (get-element-state cur-dom-node) "-reactive"))
dangling-child (try-diff-subseq cur-dom-node (.-firstChild cur-dom-node) new-children)] (reset-element-spec! cur-dom-node vdom)
(loop [cur-child dangling-child] (let [new-children (if new-attrs (nnext vdom) (next vdom))
(when cur-child dangling-child (try-diff-subseq cur-dom-node (.-firstChild cur-dom-node) new-children)]
(let [next-sib (.-nextSibling cur-child)] (loop [cur-child dangling-child]
(.removeChild cur-dom-node cur-child) (when cur-child
(recur next-sib))))) (let [next-sib (.-nextSibling cur-child)]
cur-dom-node) (.removeChild cur-dom-node cur-child)
(replace-node-completly parent vdom cur-dom-node)))) (recur next-sib)))))
cur-dom-node))
(do
;(println "build hit" (first vdom) (first cur-vdom))
(replace-node-completely parent vdom cur-dom-node top-level)))))
(defn- replace-child [parent new-elem-spec cur-dom-node top-level] (defn- replace-child [parent new-elem-spec cur-dom-node top-level]
(let [new-virtual-dom (get-virtual-dom new-elem-spec)] (let [new-virtual-dom (get-virtual-dom new-elem-spec)]
@ -582,12 +591,7 @@
(try-diff parent new-virtual-dom cur-dom-node top-level))) (try-diff parent new-virtual-dom cur-dom-node top-level)))
(try-diff parent new-virtual-dom cur-dom-node top-level)) (try-diff parent new-virtual-dom cur-dom-node top-level))
(if top-level (replace-node-completely parent new-elem-spec cur-dom-node top-level)))))
(do
(println "starting full replace")
(time
(replace-node-completly parent new-elem-spec cur-dom-node))))
(replace-node-completly parent new-elem-spec cur-dom-node)))))
(defn- insert-child [parent vdom before] (defn- insert-child [parent vdom before]
(let [new-elem (build-element vdom)] (let [new-elem (build-element vdom)]
@ -667,6 +671,8 @@
(let [id (new-reactive-id) (let [id (new-reactive-id)
state (ReactiveElement. id parent nil false false false nil nil) state (ReactiveElement. id parent nil false false false nil nil)
ref-meta (meta ref)
get-new-elem (fn [] get-new-elem (fn []
(set! (.-dirty state) false) (set! (.-dirty state) false)
(add-watch* child-ref state (.-invalidate state)) (add-watch* child-ref state (.-invalidate state))
@ -716,13 +722,23 @@
(set! (.-dirty state) true) (set! (.-dirty state) true)
(when-not (.-updating state) (when-not (.-updating state)
(set! (.-updating state) true) (set! (.-updating state) true)
(queue-animation animate)))))] (queue-animation animate)))))
binding-invalidated (:binding-invalidated ref-meta)
invalidate (if binding-invalidated
(fn binding-invalidated-wrapper
([key child-ref _ _] (binding-invalidated-wrapper key child-ref))
([key child-ref]
(when (binding-invalidated (.-cur-element state) child-ref)
(invalidate key child-ref))))
invalidate)]
(set! (.-animate state) animate) (set! (.-animate state) animate)
(set! (.-invalidate state) invalidate) (set! (.-invalidate state) invalidate)
(when-let [binding-disposed (get (meta child-ref) :binding-disposed)] (when-let [binding-disposed (get (meta child-ref) :binding-disposed)]
(set! (.-disposed-callback state) binding-disposed)) (set! (.-disposed-callback state) binding-disposed))
(when-let [parent-state (get-element-state parent)] (when-let [parent-state (get-element-state parent)]
(register-with-parent-state parent-state (str "-reactive" id) state)) (register-with-parent-state parent-state id state))
(when-let [binding-initialized (get (meta child-ref) (when-let [binding-initialized (get (meta child-ref)
:binding-initialized)] :binding-initialized)]
(binding-initialized)) (binding-initialized))