Добавить к атрибуту в Enlive

Можно ли добавить значение к атрибуту, используя ive?

пример: у меня есть это

<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))))

Но я бы предпочел не вставлять URL в мой код, просто добавив идентификатор к существующему URL

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

2 ответа

Ответ @ddk точен, но вы можете предпочесть более общий способ решения проблемы

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

а потом

(update-attr :href str "123")

Вы всегда можете написать свой собственный 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на живом представлении <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"}
Другие вопросы по тегам