在clojure中,如何创建模板以从地图添加值和键

时间:2013-08-14 15:09:23

标签: clojure enlive

我想用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) 我做错了什么?

1 个答案:

答案 0 :(得分:1)

当您致电(keys content)时发生错误,因为(:event-data dummy-content)会返回一个向量,而keys将无法对向量进行操作。您有两个选项 - 您可以在其他位置定义标题列,也可以从向量中的第一个元素中获取它们,如下所示:(keys (first content))

修改

我已经开始复制你在问题中提出的内容,但修复错误,你可以在这里找到我的努力:https://www.refheap.com/17659

如果您想要具有更典型的表结构的东西,并且行中包含值单元格,您可以尝试以下操作。它使用clone-for而不是appendfor的组合,并使用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))))))