我正在用clojure和clojurescript开发RIA.后端使用打嗝生成一个结果html,如
(html5 [:head (include-js "/js/my-cljs-generated.js")] [:body ... ])
如何在生成的html中将edn(hashmap,vector等)传递给clojurescript,即不进行ajax调用?
我想让打嗝做这样的事情:
(include-edn "var_name" {:foo :bar}) ; or any other clojure data
并且能够以某种方式从cljs访问传递的edn(例如,通过名称).
目前我的实现有点hacky并且存储在全局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)))
虽然,再次,你的方法很好.