2012-09-11 25 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

相關問題