7

私は Clojure と Compojure の Web 開発に比較的慣れていません。私が作成しているおもちゃの例で最初に気付いた問題は、HTML テンプレートの問題です。Rails のパーシャルや、Django が使用するテンプレート フレームワークなどのサポートが必要です。

現在私は持っています:

(defn index-page []
(html5
    [:head
        [:title "Home | Compojure Docs"]
        (include-css "/css/bootstrap.min.css")
        (include-css "/css/bootstrap-responsive.min.css")]
    [:body
        [:div {:class "container-fluid"}
            [:div {:class "row-fluid"}
                [:div {:class "span2 menu"}]
                [:div {:class "span10 content"}
                    [:h1 "Compojure Docs"]
                    [:ul
                        [:li
                            [:a {:href "/getting-started"} "Getting Started"]]
                        [:li
                            [:a {:href "/routes-in-detail"} "Routes in Detail"]]
                        [:li
                            [:a {:href "/destructuring-syntax"} "Destructuring Syntax"]]
                        [:li
                            [:a {:href "/nesting-routes"} "Nesting Routes"]]
                        [:li
                            [:a {:href "/api-documentation"} "API Documentation"]]
                        [:li
                            [:a {:href "/paas-platforms"} "PaaS Platforms"]]
                        [:li
                            [:a {:href "/example-project"} "Example Project"]]
                        [:li
                            [:a {:href "/example-project-on-cloudbees"} "Example Project on CloudBees"]]
                        [:li
                            [:a {:href "/interactive-development-with-ring"} "Interactive Development with Ring"]]
                        [:li
                            [:a {:href "/emacs-indentation"} "Emacs Indentation"]]
                        [:li
                            [:a {:href "/sessions"} "Sessions"]]
                        [:li
                            [:a {:href "/common-problems"} "Common Problems"]]]
                    (include-js "/js/jquery-1.9.1.min.js")
                    (include-js "/js/bootstrap.min.js")]]]]))

(defn routes-in-detail []
(html5
    [:head
        [:title "Routes in Detail | Compojure Docs"]
        (include-css "/css/style.css")]
    [:body
        [:h1 "Routes in Detail"]]))

コードを繰り返さないようにする良い方法はありますか? HEAD タグ内のものを独自のテンプレート ファイルまたは関数に入れて、それを後でインクルードできるようにしたいと考えています。たとえば、「routes-in-detail」機能に含めたいと思います。Enlive を見てきましたが、Hiccup でそれを使用する方法がわかりません。ここでのベスト プラクティスに関するご意見をいただければ幸いです。

4

2 に答える 2

11

マークアップの一部を個別の vars に引き出すことができます。

(def head
  [:head
    [:title "Home | Compojure Docs"]
    (include-css "/css/bootstrap.min.css")
     ... ])

(defn routes-in-detail []
  (html5
    head
    [:body
      ... ]))

スニペット/パーシャルがパラメーターを受け取る必要がある場合は、代わりに関数にすることができます。次に例を示します。

(defn head [title]
  [:head
    [:title title]
    (include-css "/css/bootstrap.min.css")
     ... ])

(defn routes-in-detail []
  (html5
    (head "Routes in detail")
    ... ))

「スニペット」を単一の要素ではなく、複数のトップレベル要素で構成したい場合があります。その場合、それらをリストにラップすることができます - hiccup はそれをインラインで展開します:

(defn head-contents [title]
  (list [:title title]
        (include-css "/css/bootstrap.min.css")
        ... )))

(defn routes-in-detail []
  (html5
    [:head (head-contents "Routes in detail")]
    [:body ... ]))

hiccup マークアップが単純な clojure データ構造から作成されているという事実に気付くと、関数を使用してそれを操作/構築するのは簡単で柔軟であることがわかります。

于 2013-03-13T15:32:44.607 に答える
0

Djangoテンプレートライブラリをモデルにした新しいテンプレートライブラリがありclabangoます。これはあなたが探しているものかもしれません:https ://github.com/danlarkin/clabango

于 2013-03-15T00:25:26.517 に答える