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は削除する特定のイベントハンドラーを認識する必要があります。あなたのコードでは、イベントハンドラーをアタッチすると、新しいハンドラー関数が作成されてアタッチされ、他のコードでは、別の新しい関数が作成され(コードは同じですが)、リッスンを解除しようとするため、基本的には必要に応じて機能しませんイベントのバインド中に使用したものと同じ関数オブジェクトを渡して、リッスンを解除します。

これを解決するには、ハンドラーを名前(匿名ではない)の関数として定義し、その関数をバインドおよびバインド解除イベントで使用する必要があります。

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

解決済み:ドミナ(これは良いことですが、すべての関数がlein-depsにあるわけではありません)を使用してclojureScriptを使用する代わりに、1つのイベントモデルが最終的にソースに直接移動しました...requireセクションに追加されました名前空間の:

[goog.events :as g-events]

次に、使用される削除機能で:

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

そしてそれはチャンピオンのように機能します。これが将来誰かに役立つことを願っています...

于 2012-09-11T17:41:37.913 に答える