附加到Enlive中的属性

Xia*_*ian 3 clojure enlive

是否可以使用enlive将值附加到属性?

例如:我有这个

<a href="/item/edit/">edit</a>
Run Code Online (Sandbox Code Playgroud)

并希望这样

<a href="/item/edit/123">edit</a>
Run Code Online (Sandbox Code Playgroud)

我目前正在这样做:

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

但我不希望将URL嵌入到我的代码中,只需将id附加到现有URL即可

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

cgr*_*and 6

@ddk答案是现场,但您可能更喜欢更通用的方法来解决问题

(defn update-attr [attr f & args]
    (fn [node]
      (apply update-in node [:attrs attr] f args))))
Run Code Online (Sandbox Code Playgroud)

然后

(update-attr :href str "123")
Run Code Online (Sandbox Code Playgroud)

  • 为什么不把它添加到Enlive?只是需要它. (2认同)

ddk*_*ddk 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))))
Run Code Online (Sandbox Code Playgroud)

当附加"/bar"hrefenlive的表示时,会给出以下内容<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"}
Run Code Online (Sandbox Code Playgroud)