在ClojureScript One项目中使用clojure.browser.event.unlisten

时间:2012-09-11 03:48:47

标签: clojure clojurescript

我正在尝试编写一个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"))

代码运行没有错误,但是没有删除监听器,我想我有语法错误,但我不知道在哪里。

非常感谢任何帮助。 谢谢拉里

2 个答案:

答案 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")

它就像一个冠军。 希望这可以帮助将来的某个人......