我正在使用clojure和clojurescript开发RIA。后端使用呃逆生成一个结果html,比如
(html5
[:head
(include-js "/js/my-cljs-generated.js")]
[:body ... ])如何传递edn(hashmap、vector等)在生成的html中执行clojurescript,即不执行ajax调用?
我想让hiccup做这样的事情:
(include-edn
"var_name" {:foo :bar}) ; or any other clojure data并且能够以某种方式(例如通过名称)访问从cljs传递的edn。
目前,我的实现有点老套,将edn存储在全局js变量中。
(hiccup/javascript-tag (str "var edn = \""
(pr-str my-clojure-data) "\";")) 而在cljs方面,smth就像
(jayq/document-ready
(fn []
(if-let [edn (.-edn js/window)]
(do-something-with (cljs.reader/read-string edn))
)
...
)也许有更多惯用的方式来实现这一点?
发布于 2014-09-08 01:06:30
你的方法很好。如果您担心手动创建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)))不过,再说一次,您的方法很好。
发布于 2013-03-17 04:47:42
你的“实现”是完全正确的。将其封装在一个函数中,如果这让您感觉更舒服的话:)
如果你发出编译过的ClojureScript,这不会有什么不同;它的值仍然是全局的和可变的。
发布于 2013-03-27 18:37:12
您可以考虑推(基于事件)方法,而不是拉:将生成的edn数据作为字符串放在:script标记内,作为javascript调用clojurescript函数的参数。当浏览器加载脚本时,它会将edn发送到您的处理程序函数,允许它由您的应用程序加载。
这将比您当前的方法更惯用一些,因为它不需要状态或全局数据,并且如果需要,可以很容易地在以后使用ajax。
https://stackoverflow.com/questions/15423136
复制相似问题