2012-09-11 21 views
2

我想我的手写一个clojureScript一个项目,但我有麻烦删除事件监听器(unlisten) - 监听器注册此代码:在ClojureScript中使用clojure.browser.event.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")))) 

但是当我尝试使用此代码UNLISTEN:

(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

解决:不要试图使用多米纳(这是个好东西,但不是所有的功能都在雷音-DEPS),并尝试使用clojureScript一个事件模型,最后干脆直接去源。 ..添加到命名空间的需要部分:

[goog.events :as g-events] 

然后在使用的删除功能:

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

和它的作品就像一个冠军。 希望这可以帮助未来的人...

0

在DOM中,您可以将多个事件处理程序附加到单个元素,因此,当您要删除事件处理程序时,DOM需要知道要删除哪个特定的事件处理程序。在你的代码中,附加的事件处理函数创建一个新的处理函数并附加它,并在另一个代码中创建另一个新函数(尽管代码相同)并试图解除它,所以基本上它不起作用,因为你需要传递相同的函数对象来解除绑定事件时使用的对象。

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

(defn myHandler [& args] (dispatch/fire (re-class ele-id "foldup" "expand"))) 
+0

可悲的是,不起作用。看起来我不能用这样的函数来绑定事件,我尝试了很多方法,但它只以匿名方式添加了监听器,所以从来没有进入unlisten部分。谢谢Ankur – Larry

相关问题