マクロを使用して一連の類似した Om コンポーネントを生成しようとしています (たとえば、共通のボイラープレートと動的な「ボディ」を含むモーダル要素)。
以下のソリューションがほとんど機能しています。owner
1 つの例外は、フォームの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
マクロの本体で適切なものを利用できるようにするにはどうすればよいですか?