首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将(for)与呃和noir连用

将(for)与呃和noir连用
EN

Stack Overflow用户
提问于 2011-11-12 18:01:20
回答 3查看 1.2K关注 0票数 4

我使用的是clojure和hiccup (带有noir),我有以下代码:

代码语言:javascript
复制
(defn dataframe [id]
   (db/db-to-data id))

(defpartial drop-downs [nms]
  (for [nm (keys nms)] (drop-down nm (get nms nm))[:br])
  (submit-button "Refresh")  
  )

(defpage "/dataset/table/:id" {:keys [id]}
  (common/layout
    (form-to [:post (format "/dataset/table/%s" id)]
      (drop-downs {"alessio" [:col0], "test" [:col1]})
      )
   (html-table (dataframe id))))

我的问题是:

代码语言:javascript
复制
(for [nm (keys nms)] (drop-down nm (get nms nm))[:br])

我希望在我的表单中有多个选择。上面的代码行可以做到这一点,但是由于某些原因,它没有考虑:br,所以它不会中断行。但是,如果我这样做:

代码语言:javascript
复制
(form-to [:post (format "/dataset/table/%s" id)]
      (drop-down "Test1" "1")[:br]
      (drop-down "Test2" "2")[:br]
      )

:br标记可以工作。我相信这与(for)宏的工作方式有关,但我不知道原因和如何修复它。

编辑

按照建议,我放弃了for的使用。最终结果如下(这是Joost的答案,略带mod):

代码语言:javascript
复制
(mapcat #(vector (drop-down % (nms %)) [:br]) (keys nms))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-12 18:46:11

这段代码甚至不能编译;for恰好有两个参数。

如果您想在for返回的序列中一次放入两个项目,请将它们放入一个向量中,稍后再将它们解包。

不过就我个人而言,我更喜欢在这些情况下使用mapcat。类似于:

代码语言:javascript
复制
(into (form-to [:post (format "/dataset/table/%s" id)])
  (mapcat #(vector (drop-down % (nms %)) [:br]) nms))
票数 5
EN

Stack Overflow用户

发布于 2011-11-12 18:52:27

我整理了一些小东西,不使用Noir或hiccup,但可能会引导你走向更好的方向。它使用mapcat而不是for:

代码语言:javascript
复制
 (let [nms {"alessio" [:col0], "test" [:col1]}]
  (mapcat 
    (fn [mapentry] [[:dropdown (first mapentry) (second mapentry)] [:br]]) nms))

;;=> ([:dropdown "alessio" [:col0]] [:br] [:dropdown "test" [:col1]] [:br])
票数 1
EN

Stack Overflow用户

发布于 2011-11-14 10:13:53

Hiccup自动“解开”序列/列表(而不是向量!),所以你可以这样写:

代码语言:javascript
复制
(for [[k v] nms]
  (list (drop-down k v)
        [:br])))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8103757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档