Clojurescript 如何处理与多米娜的委托

Clojurescript 如何处理与多米娜的委托,clojurescript,Clojurescript,我一直在尝试使用 HTML: 我不满意的解决方案(没有非常详细的Domina库): 我尝试过许多解决方案,但都失败了-都有点类似于: (listen! (by-id "my-form") :submit #(do (log "submit suppressed") false)) 我故意不使用click事件,因为我还希望在通过代码或键盘提交表单

我一直在尝试使用

HTML:

我不满意的解决方案(没有非常详细的Domina库):

我尝试过许多解决方案,但都失败了-都有点类似于:

(listen! (by-id "my-form") :submit #(do
                                      (log "submit suppressed")
                                      false))

我故意不使用click事件,因为我还希望在通过代码或键盘提交表单时执行函数。

当您从
jQuery
事件处理程序中返回
false
时,库将自动调用
e.preventDefault
e.stopPropagation
(有关更多信息,请参阅)。调用此函数是控制
事件的行为的正确方法

Domina将
js/Event
包装在
ClojureScript
能够理解的内容中。因此,您可以直接调用
preventDefault
stopPropagation
,而无需使用Javascript互操作。您可以在此处阅读有关此巧妙技巧的更多信息:

此技巧可能是导致返回
false
根本不起作用的原因。实现此技巧的方法(查看代码)是使用另一个始终返回
true
的函数包装函数

因此,您的代码应该更像这样:

(listen! (by-id "my-form") :submit
         (fn [e]
           (do
             (log "submit suppressed")
             (prevent-default e)
             (stop-propagation e))))

我已将警报放在事件调用之间。第一次事件调用后-无论是preventDefault还是stopPropagation,之后的所有内容都将被忽略(不再显示警报并提交表单)。可能是Domina包装搞乱了事情。也许你是对的,我会看看并尝试找到解决方法。问题是
事件
的Domina包装。我更新了我的答案,很抱歉发布了错误的答案(发布前我无法测试代码).由于某种原因,版主拒绝了你的编辑。我自己编辑了答案。
(set! (.-onsubmit (.getElementById js/document "my-form")) #(do
                                                              (.log js/console "submit suppressed")
                                                              false))
(listen! (by-id "my-form") :submit #(do
                                      (log "submit suppressed")
                                      false))
(listen! (by-id "my-form") :submit
         (fn [e]
           (do
             (log "submit suppressed")
             (prevent-default e)
             (stop-propagation e))))