i'm attempting use macros generate series of similar om components (e.g. modal element contains common boilerplate , dynamic "body").
i've got solution below mostly working. 1 exception accessing appropriate owner
in form's on-submit
event handler.
;; macros.clj (defmacro build-modal ([disp-name body] `(fn [_# owner#] (reify om.core/irender (~'render [_#] (dom/div {:class "login-view-modal"} (dom/div {:class "login-view-modal-backsplash"}) (dom/div {:class "login-view-modal-content"} ~@body))))) nil)) ;; ui.cljs (defn login-view-modal [] (bs-macros/build-modal "login-modal" '(dom/form {:on-submit (fn [event] (.preventdefault event) (let [username (get-value owner "username") password (get-value owner "password") data {:email_address username :password password}] (handle-login-view-modal-form-submit data)))} ;; elided brevity (dom/div (dom/button "log in"))))) (defcomponent home-page-view [app owner] (init-state [_] {:text ""}) (render-state [this state] ;; elided brevity (dom/div (login-view-modal))))
the modal rendered expected, when submitting form i'm presented error: uncaught typeerror: cannot read property 'getdomnode' of undefined
, seems because owner
not in scope. (note, element , event handler functions expected when constructed in full - i.e. without using macro.)
how make appropriate owner
available body of macro?
you need variable capture work. instead of gen-syming via owner#
generate unique symbol, inline ~'owner
wherever want refer it.
Comments
Post a Comment