我使用的是clojure和hiccup (带有noir),我有以下代码:
(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))))我的问题是:
(for [nm (keys nms)] (drop-down nm (get nms nm))[:br])我希望在我的表单中有多个选择。上面的代码行可以做到这一点,但是由于某些原因,它没有考虑:br,所以它不会中断行。但是,如果我这样做:
(form-to [:post (format "/dataset/table/%s" id)]
(drop-down "Test1" "1")[:br]
(drop-down "Test2" "2")[:br]
):br标记可以工作。我相信这与(for)宏的工作方式有关,但我不知道原因和如何修复它。
编辑
按照建议,我放弃了for的使用。最终结果如下(这是Joost的答案,略带mod):
(mapcat #(vector (drop-down % (nms %)) [:br]) (keys nms))发布于 2011-11-12 18:46:11
这段代码甚至不能编译;for恰好有两个参数。
如果您想在for返回的序列中一次放入两个项目,请将它们放入一个向量中,稍后再将它们解包。
不过就我个人而言,我更喜欢在这些情况下使用mapcat。类似于:
(into (form-to [:post (format "/dataset/table/%s" id)])
(mapcat #(vector (drop-down % (nms %)) [:br]) nms))发布于 2011-11-12 18:52:27
我整理了一些小东西,不使用Noir或hiccup,但可能会引导你走向更好的方向。它使用mapcat而不是for:
(let [nms {"alessio" [:col0], "test" [:col1]}]
(mapcat
(fn [mapentry] [[:dropdown (first mapentry) (second mapentry)] [:br]]) nms))
;;=> ([:dropdown "alessio" [:col0]] [:br] [:dropdown "test" [:col1]] [:br])发布于 2011-11-14 10:13:53
Hiccup自动“解开”序列/列表(而不是向量!),所以你可以这样写:
(for [[k v] nms]
(list (drop-down k v)
[:br])))https://stackoverflow.com/questions/8103757
复制相似问题