我正在尝试编写一个clojureScript One项目,但是我在删除事件监听器时遇到了问题(unlisten) - 使用此代码注册了监听器:
(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"))
代码运行没有错误,但是没有删除监听器,我想我有语法错误,但我不知道在哪里。
非常感谢任何帮助。 谢谢拉里
答案 0 :(得分:0)
在DOM中,您可以将许多事件处理程序附加到单个元素,因此当您想要删除事件处理程序时,DOM需要知道要删除的特定事件处理程序。在你的代码中,事件处理程序的附加创建一个新的处理函数并附加它,并在其他代码中创建另一个新函数(虽然代码是相同的)并尝试取消它,所以基本上它不能工作,因为你需要传递相同的函数对象,以便在绑定事件时使用unlisten。
要解决此问题,您需要将处理程序定义为具有名称(非匿名)的函数,并在bind和unbind事件中使用该函数。
(defn myHandler [& args] (dispatch/fire (re-class ele-id "foldup" "expand")))
答案 1 :(得分:0)
解决:而不是试图使用多米纳(这是好东西但不是所有的功能都在lein-deps中)并且尝试使用clojureScript One事件模型最后只是直接到源...添加到命名空间的require部分:
[goog.events :as g-events]
然后在使用的删除功能中:
(g-events/removeAll (by-id ele-id) "click")
它就像一个冠军。 希望这可以帮助将来的某个人......