2

我正在尝试编写一个 clojureScript One 项目,但在删除事件侦听器(未侦听)时遇到问题 - 侦听器已使用以下代码注册:

(defn- add-expand_fold-listener
"Accepts a ele-id and creates listeners for click events on div
which will then fire rendering changes"
[ele-id]
(log/log "adding opening listeners")
(event/listen (single-node (by-id ele-id))
    "click"
#(dispatch/fire (re-class ele-id "foldup" "expand"))))

但是当我尝试用这段代码不听时:

(defn- remove-expand_fold-listener
 "Accepts a ele-id and removes listener for click events on div"
 [ele-id]
 (log/log "removing opening listener")
(event/unlisten (by-id ele-id) 
      "click" 
      #(dispatch/fire (re-class ele-id "foldup" "expand")) 
      false)
(log/log "done removing listener"))

代码运行没有错误,但监听器没有被删除,我想我有一个语法错误,但我不确定在哪里。

任何帮助将不胜感激。谢谢拉里

4

2 回答 2

0

在 DOM 中,您可以将多个事件处理程序附加到单个元素,因此当您想要删除一个事件处理程序时,DOM 需要知道您要删除哪个特定的事件处理程序。在您的代码中,附加事件处理程序会创建一个新的处理程序函数并附加它,而在其他代码中它会创建另一个新函数(尽管代码相同)并尝试取消监听它,所以基本上它不能按您的需要工作将绑定事件时使用的相同函数对象传递给 unlisten。

要解决此问题,您需要将处理程序定义为具有名称(非匿名)的函数,并在绑定和取消绑定事件中使用该函数。

(defn myHandler [& args] (dispatch/fire (re-class ele-id "foldup" "expand")))
于 2012-09-11T05:47:58.017 回答
0

已解决:与其尝试使用 domina(这是个好东西,但并非所有功能都在 lein-deps 中),而是尝试使用 clojureScript One 事件模型最终直接找到了源代码...添加到了 require 部分命名空间:

[goog.events :as g-events]

然后在使用的remove函数中:

(g-events/removeAll (by-id ele-id) "click")

它就像一个冠军。希望这对将来的人有所帮助...

于 2012-09-11T17:41:37.913 回答