【发布时间】:2015-03-06 04:52:22
【问题描述】:
假设我有以下地图:
(def m {"a" {"d" {}
"e" {}}
"b" {"f" {}
"g" {"h" {}
"i" {}}}
"c" {}})
我需要这样渲染:
(om.dom/div #js {} "a"
(om.dom/div #js {} "d")
(om.dom/div #js {} "e"))
(om.dom/div #js {} "b"
(om.dom/div #js {} "f")
(om.dom/div #js {} "g"
(om.dom/div #js {} "h")
(om.dom/div #js {} "i")))
(om.dom/div #js {} "c")
我该怎么做呢?我已经搞砸了clojure.walk,但无法让它先在叶子上调用om.dom/div,然后是直接父母等。
我认为解决方案可能涉及在给定子图的vals 上映射递归函数。它会将地图分开,直到它看到一个叶子,然后冒泡om.dom/div 调用返回地图。
到目前为止我有这个功能:
(defn build-tree [data]
(apply dom/div #js {}
(->> (clojure.walk/postwalk
#(cond (map? %) (vec %)
(vector? %) %
(string? %) %) data)
(clojure.walk/postwalk
#(if (and (vector? %) (string? (first %)))
(apply dom/div #js {} %) %)))))
结果:
在检查器中使用这个:
生成嵌套dom/ul 和dom/li 元素的奖励积分..
【问题讨论】:
标签: clojure clojurescript om