我想用Clojure的Enlive创建一个模板,用于像html页面这样的“表格”,它应该有一个标题和行。我想使用来自此地图的数据填充此“表格”。 Basicaly我想用键填充标题,以及来自每个映射的val的单元格:event-data key。
(def dummy-content
{:title "Events Mashup"
:event-data [{ :event-name "event name 1"
:performer "performer 1"
:date "date 1"
:start-time "start time 1"
:end-time "end time 1"}
{:event-name "event name 2"
:performer "performer 2"
:date "date 2"
:start-time "start time 2"
:end-time "end time 2"}]})
我的代码段和模板如下所示:
(defsnippet header-cell "index.html" [:.psdg-top-cell] [value] [:.psdg-top-cell]
(defsnippet value-cell "index.html" [:.psdg-right] [value] [:.psdg-right]
(deftemplate mshp "index.html" [content]
[:.psdg-top] (append (for [c (keys content)] (header-cell c)))
[:.psdg-right] (append (for [v (vals content)] (value-cell v))))
index.html有这些标签,与此模板相关。
<div id="psdg-top">
<div class="psdg-top-cell" style="width:129px; text-align:left; padding- left:24px;">Summary</div>
<div class="psdg-top-cell">Website.com</div>
</div>
<div class="psdg-right">10 000</div>
当我调用模板时,我收到此错误:
=> (mshp (:event-data dummy-content))
ClassCastException clojure.lang.PersistentHashMap无法强制转换为java.util.Map $ Entry clojure.lang.APersistentMap $ ValSeq.first(APersistentMap.java:183) 我做错了什么?
答案 0 :(得分:1)
当您致电(keys content)
时发生错误,因为(:event-data dummy-content)
会返回一个向量,而keys
将无法对向量进行操作。您有两个选项 - 您可以在其他位置定义标题列,也可以从向量中的第一个元素中获取它们,如下所示:(keys (first content))
。
修改强>
我已经开始复制你在问题中提出的内容,但修复错误,你可以在这里找到我的努力:https://www.refheap.com/17659。
如果您想要具有更典型的表结构的东西,并且行中包含值单元格,您可以尝试以下操作。它使用clone-for
而不是append
和for
的组合,并使用nth-of-type
只返回第一个“psdg-top-cell”(否则会有两倍许多)
(def template
(html-snippet
"<div id=\"psdg-top\">
<div class=\"psdg-top-cell\">Summary</div>
<div class=\"psdg-top-cell\">Website.com</div>
</div>
<div class=\"psdg-right\">10 000</div>"))
(defsnippet header-row template [[:.psdg-top-cell (nth-of-type 1)] ] [headers]
(clone-for [h headers]
(content h)))
(defsnippet value-row template [:.psdg-right] [values]
(clone-for [v values]
(content v)))
(deftemplate mshp template [events]
[:#psdg-top] (content (header-row (map name (keys (first events)))))
[:.psdg-right] (clone-for [e events]
(do->
(wrap :div {:class "psdg-row"})
(content (value-row (vals e))))))