从CLJ调用CLJS函数的控制流程控制

3
似乎这应该很简单,而且我也以为是...直到我从运行Figwheel转换为运行JAR文件时它停止工作。
问题可以简化为一个相当简单的例子:
使用Leiningen "Reagent"模板创建一个名为"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 once" 和 "lein figwheel" 命令,并浏览该网站。点击“Say Hello”按钮会触发警报。
回到Shell界面,请执行 "lein uberjar" 命令并使用Java运行生成的.jar文件。浏览该网站。点击“Say Hello”按钮将不起作用。控制台显示“buttontest未定义”。
我已经尝试了各种方法(调整/删除“onclick”属性中的名称空间限定符,手动包含其他.JS文件等),但没有成功。我觉得我缺少一些明显的东西。
有任何想法吗?谢谢。

你正在使用hiccup生成HTML?那看起来是什么样子的? - Alan Thompson
@AlanThompson 这个代码写得很简洁。我使用Reitit,因此我构建了一个大数据结构,在handler.clj中定义了所有路由。在这个数据结构中,每个路径都有一个处理函数的位置。每个处理函数返回一个映射,其中成员包括标头、会话、一些其他杂项和响应页面的正文。这个正文可以作为Reagent用来挂接东西的钩子,但这并不是必须的。完全可以返回一个带有类似 ':body (html5 (head)[:body [:h1 "Hello, World"]])' 的成员的映射。 - user1172763
1个回答

6
尝试给你的 `greet` 函数添加 `export` 元标志:
(defn ^:export greet ...)

我想像着:advanced编译优化会混淆命名空间/函数名称,而:export则禁止这种情况发生(或类似的情况)。


1
这个方法很有效,现在我知道答案后也非常清晰明了。谢谢! - user1172763

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接