【问题标题】:In clojure enlive how to create template to add values and keys from a map在 clojure 中,如何创建模板以从地图中添加值和键
【发布时间】:2013-08-16 15:00:18
【问题描述】:

我想用 Clojure 的 Enlive 为像 html 页面这样的“表格”创建一个模板,它应该有一个标题和行。我想用来自这张地图的数据填充这个“表格”。基本上我想用键填充标题,并用来自 :event-data 键的每个映射的 val 填充单元格。

(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"}]})

我的 sn-ps 和模板如下所示:

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

【问题讨论】:

    标签: clojure enlive


    【解决方案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))))))
    

    【讨论】:

    • 它现在可以工作,当我这样称呼它时(print (apply str (mshp (:event-data dummy-content)))),它似乎没问题,除了首先只给我第一个地图...
    • 我不知道为什么会这样 => (html/sniptest "
      Website.com
      " [:.psdg- top-cell] (html/content (name (first(keys (first (:event-data dummy-content))))))) "
      结束时间" 和 defsn-p 什么都没有改变?
    • @Vesna 我编辑了我的答案以提供我认为会有所帮助的完整代码示例
    • 谢谢,我会接受你的回答,这样就可以了,现在解决下一个问题:)
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签