我试图使用宏生成一系列类似的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提供给宏的主体?
发布于 2015-06-03 03:16:59
您需要变量捕获才能工作。与通过owner#生成唯一符号的gen-syming不同的是,只要您想要引用它,只要内联~'owner即可。
https://stackoverflow.com/questions/30609846
复制相似问题