我正在尝试使用宏来生成一系列类似的 Om 组件(例如,包含通用样板和动态“主体”的模态元素)。
我有下面的解决方案主要工作。一个例外是owner
在表单的on-submit
事件处理程序中访问适当的。
;; 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 for brevity
(dom/div
(dom/button "LOG IN")))))
(defcomponent home-page-view [app owner]
(init-state [_] {:text ""})
(render-state [this state]
;; elided for brevity
(dom/div (login-view-modal))))
模态按预期呈现,但是在提交表单时出现错误:Uncaught TypeError: Cannot read property 'getDOMNode' of undefined
,这似乎是因为owner
不在范围内。(注意,这个元素和它的事件处理程序在完全构造时会按预期运行——即不使用宏。)
如何使owner
宏的主体可用?