以下代码片段不起作用
headerElement (goog.dom/createDom
"div" (.strobj {"style" "background-color:#EEE"})
(:title note))
原因:
{ ... } 创建了一个Clojurescript映射。我需要一个JavaScript对象/哈希表。
问题:
如何进行这个简单的转换?
headerElement (goog.dom/createDom
"div" (.strobj {"style" "background-color:#EEE"})
(:title note))
{ ... } 创建了一个Clojurescript映射。我需要一个JavaScript对象/哈希表。
如何进行这个简单的转换?
#js
读取字面量可以用于创建JavaScript对象或数组。(def test1 #js {:foo 1 :bar false})
它会创建JavaScript代码:
namespace.test1 = {"bar":false, "foo":1};
对于数组:
(def test2 #js [1 2 3 false nil true])
创造:
namespace.test2 = [1, 2, 3, false, null, true];
您还可以使用clj->js
函数:
(clj->js :style "background-color:#EEE")
它的好处是可以递归地工作 - 转换嵌套的数据结构。
我写了一篇文章介绍这个(如果我可以自荐的话)
cljs.core/js-obj可以帮助解决这个问题。请注意,它接受普通的数组/列表(而不是映射)。
headerElement (goog.dom/createDom
"div" (js-obj "style" "background-color:#EEE")
(:title note))
js-obj
:
宏
(defmacro obj [& key-values]
(let [obj-def (apply concat (map #(list (name (first %)) (last %))
(partition 2 key-values)))]
`(cljs.core/js-obj ~@obj-def)
))
Usage
(obj
:key someVal
:otherKey (fn [a b] a)
)