在enlive 1.1.4中替换vars

Bil*_*ill 1 clojure enlive

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

Welcome <b id="alert-username">${fullname}</b>
Run Code Online (Sandbox Code Playgroud)

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

[:#alert-username] (replace-vars {:fullname (fullname request)})
Run Code Online (Sandbox Code Playgroud)

这呈现如下......

 Welcome ${fullname}
Run Code Online (Sandbox Code Playgroud)

这显然不是我想要的.

但是,如果我这么做的话,它会起作用......

[:#alert-username] (fn [n] (assoc n :content [(fullname request)]))
Run Code Online (Sandbox Code Playgroud)

产量......

Welcome Bill
Run Code Online (Sandbox Code Playgroud)

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

我在这做错了什么?

Jar*_*314 5

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

{:tag :b, :attrs {:id "alert-username"}, :content ["${fullname}"]}
Run Code Online (Sandbox Code Playgroud)

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

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

[:#alert-username] (transform-content
                     (replace-vars {:fullname (fullname request)}))
Run Code Online (Sandbox Code Playgroud)

但是,这也将搜索任何子标记属性以及任何子文本节点.

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

  • 自述文件说,"替换文本和属性中的任何$ {var}." 这意味着它将适用于节点的文本子节点.我认为至少有一个案例要做得更清楚. (2认同)