在enlive 1.1.4中替换vars

时间:2013-09-08 23:16:45

标签: clojure enlive

我将以下html加载到模板中......

Welcome <b id="alert-username">${fullname}</b>

我在模板中有以下选择器/操作...

[:#alert-username] (replace-vars {:fullname (fullname request)})

这表现如下......

 Welcome ${fullname}

这显然不是我想要的。

然而,如果我这么做的话,它会起作用......

[:#alert-username] (fn [n] (assoc n :content [(fullname request)]))

产生......

Welcome Bill

所以我知道从请求中获取用户名不是问题,因为上面的代码完成了它应该做的事情。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

replace-vars转换不会递归到子节点,包括文本内容。 选择器:#alert-username选择<b id="alert-username">标记:

{:tag :b, :attrs {:id "alert-username"}, :content ["${fullname}"]}

因此,replace-vars,因为它在标记上使用,将搜索标记的属性并忽略标记的内容。

您可以使用以下内容将变换应用于内容:

[:#alert-username] (transform-content
                     (replace-vars {:fullname (fullname request)}))

但是,它还将搜索任何子标记属性以及任何子文本节点。

注意: transform-content宏是net.cgrand.enlive-html命名空间的一部分。

答案 1 :(得分:0)

由于您有一个包含$ {fullname}的标记,因此您只需使用转换

即可
[:#alter-username] (content (fullname request))

并在标记中添加任何文本。无论如何,模板中给出的标签内容都将被替换。