3

enlive を使用して属性に値を追加することは可能ですか?

例:私はこれを持っています

<a href="/item/edit/">edit</a>

そしてこれが欲しい

<a href="/item/edit/123">edit</a>

私は現在これをやっています:

(html/defsnippet foo "views/foo.html" [:#main]
  [ctxt]
  [:a] (html/set-attr :href (str "/item/edit/" (ctxt :id))))

しかし、ID を既存の URL に追加するだけで、URL をコードに埋め込まないようにしたいと思います。

(html/defsnippet foo "views/foo.html" [:#main]
  [ctxt]
  [:a@href] (html/append (ctxt :id)))
4

2 に答える 2

6

@ddkの回答は的確ですが、問題を解決するためのより一般的な方法を好むかもしれません

(defn update-attr [attr f & args]
    (fn [node]
      (apply update-in node [:attrs attr] f args))))

その後

(update-attr :href str "123")
于 2012-10-02T08:51:25.627 に答える
5

append-attrと同じように、いつでも自分で書くことができますset-attr。これが私の試みです

(defn append-attr
  [& kvs]
    (fn [node]
      (let [in-map (apply array-map kvs)
            old-attrs (:attrs node {})
            new-attrs (into {} (for [[k v] old-attrs] 
                                    [k (str v (get in-map k))]))]
        (assoc node :attrs new-attrs))))

に追加"/bar"するとhref、 enlive の表現で次のようになります<a href="/foo">A link</a>

((append-attr :href "/bar") 
  {:tag :a, :attrs {:href "/foo"}, :content "A link"})
;=> {:tag :a, :attrs {:href "/foo/bar"}, :content "A link"}
于 2012-09-25T18:03:27.150 に答える