从CLJ发出打ic控件调用CLJS函数

时间:2019-01-09 04:16:06

标签: clojure clojurescript leiningen reagent

这似乎应该很简单,我以为是...直到我从运行Figwheel切换到运行JAR文件并停止工作。

这个问题可以简化为一个简单的例子:

使用Leiningen的“试剂”模板制作一个名为“ buttontest”的新应用。

在“ ns”声明的正下方,向core.cljs添加一些脚本:

(defn greet [] (js/alert "Hi!"))

在handler.clj中添加一个静态按钮:

(defn loading-page [] (html5 (head) 
 [:body {:class "body-container"} mount-target
  ;v v v INSERTED THIS
  [:button {:onclick "buttontest.core.greet()"} "Say Hello"]
  ;^ ^ ^
  (include-js "/js/app.js")]))

执行一次“ lein cljsbuild”和“ lein figwheel”。浏览到该站点。单击“问好”按钮将触发警报。

回到shell中,执行一个“ lein uberjar”并使用Java运行生成的.JAR文件。浏览到该站点。单击时,“说声你好”按钮将无效。控制台显示“ buttontest未定义。”

我尝试了各种尝试(在“ onclick”属性中添加/删除名称空间限定,手动添加其他.JS文件等),但没有走运。我觉得我缺少明显的东西。

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:5)

尝试为greet函数赋予export元标记:

(defn ^:export greet ...)

我想象:advanced的编译优化会破坏名称空间/函数的名称,而:export会禁止这样做(或类似的东西)。