我正在用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并将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))
)
...
)
也许有更多惯用的方法来实现这一目标?
答案 0 :(得分:2)
你的方法很好。如果您担心手动创建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)))
虽然,你的方法很好。
答案 1 :(得分:1)
你的“实施”完全没问题。如果让你感觉更舒服,请将它包裹在一个功能中:)
如果您发出例如,那就不会有什么不同编译ClojureScript;价值仍然是全球性和可变的。
答案 2 :(得分:1)
您可以考虑推送(基于事件)方法,而不是拉:将生成的edn数据作为字符串放在[:script]标记内作为javascript的参数调用clojurescript函数。当浏览器加载脚本时,它会将edn发送到您的处理程序函数,允许它由您的应用程序加载。
这比当前的方法更加惯用,因为它不需要状态或全局数据,并且如果需要,可以很容易地适应以后使用ajax。