clojure - Using macros to generate Om components -


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