clojure - 如何在不发出ajax请求的情况下将edn从clojure传递到clojurescript(即通过hiccup生成的页面)

标签 clojure clojurescript hiccup edn

我正在使用 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/

相关文章:

clojure - Clojure 中的简单二维数组

javascript - js 对象到 clojurescript 矢量/ map

javascript - 需要相当于 three.js javascript 'loadTexture' 语句的 clojurescript

Clojure:Hiccup 表单处理程序

clojure - 如何共享 Clojars 中没有的依赖项

jquery - Clojure 相当于 jQuery Deferred?

clojure - 更新原子/范围

clojure - 打ic 1.0.0-beta1错误

clojure - 什么是 :<> in reagent hiccup?

clojure - 我可以将内容配置为 Clojure REPL 自动需要的内容吗?