我正在使用 clojure 和 clojurescript 开发 RIA。后端使用 hiccup 生成结果 html,例如
(html5
[:head
(include-js "/js/my-cljs-generated.js")]
[:body ... ])
如何在生成的 html 中将 edn(hashmap、向量等) 传递给 clojurescript,即不进行 ajax 调用?
我想让 hiccup 做这样的事情:
(include-edn
"var_name" {:foo :bar}) ; or any other clojure data
并且能够以某种方式从 cljs 访问传递的 edn(例如通过名称)。
目前我的实现有点hacky并将edn存储在全局js var中
(hiccup/javascript-tag (str "var edn = \""
(pr-str my-clojure-data) "\";"))
在 cljs 方面,类似
(jayq/document-ready
(fn []
(if-let [edn (.-edn js/window)]
(do-something-with (cljs.reader/read-string edn))
)
...
)
也许有更惯用的方法来实现这一目标?
最佳答案
你的方法很好。如果您担心手动创建 JavaScript 代码,另一种方法是将 pr-str 的结果作为数据放入定义良好的元素中。大致如下:
[:div {:style {:display "hidden"}
:id "server-originated-data"
:data-var-1 (pr-str var-1)
:data-var-2 (pr-str var-2)}]
然后您可以使用以下内容从 ClojureScript 获取该数据:
(defn get-data
[tag]
(-> (.getElementById js/document "server-originated-data")
(.getAttribute (str "data-" tag))
(cljs.reader/read-string)))
尽管如此,你的方法还是不错的。
关于clojure - 如何在不发出ajax请求的情况下将edn从clojure传递到clojurescript(即通过hiccup生成的页面),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15423136/