2012-09-25 23 views
3

是否可以使用enlive將值附加到屬性?附加到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

(html/defsnippet foo "views/foo.html" [:#main] 
    [ctxt] 
    [:[email protected]] (html/append (ctxt :id))) 
+0

我還沒有找到一個很好的方法來使ahev選擇器擴展到有活力的屬性,但我想。 – cgrand

回答

5

您可以隨時編寫自己的append-attrset-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"} 
+0

感謝您的支持。希望可能會有一些我剛剛失蹤的東西。如果沒有其他人知道任何神奇的東西,請將此標記爲解決方案:) – Xian

6

@ddk答案enlive的表示是點上,但你可能更願意解決一個更通用的方法問題

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

然後

(update-attr :href str "123") 
+2

爲什麼不將此添加到Enlive?只需要它。 –

+1

我想這也包括在內,有些情況下需要修改鏈接,而目前還沒有明顯的方式來做到這一點。 – mikkom