1

マクロを使用して一連の類似した Om コンポーネントを生成しようとしています (たとえば、共通のボイラープレートと動的な「ボディ」を含むモーダル要素)。

以下のソリューションがほとんど機能しています。owner1 つの例外は、フォームの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マクロの本体で適切なものを利用できるようにするにはどうすればよいですか?

4

1 に答える 1

4

これを機能させるには、変数のキャプチャが必要です。owner#一意のシンボルを生成するgen-syming via の代わりに、~'owner参照したい場所にインライン化します。

于 2015-06-03T03:16:59.087 に答える