2014-04-17 26 views
0

我正在使用enfocus進行ClojuseScript中的dom操作。enfocus(clojurescript)中的事件處理不起作用

我有一個事件處理程序:

(ns numeros-linguas.script 
    (:require [enfocus.core :as ef] 
      [enfocus.events :as ev]) 
    (:require-macros [enfocus.macros :as em])) 

(defn aviso-seleciona [] 
    (ef/at "select" (ev/listen :change 
          (fn [evt] 
           (let [lingua-id (ef/from [:select] (ef/get-prop :value)) 
            lingua-selector (str "#" lingua-id) 
            cores (array "azul" "vermelho" "laranja" "verde") 
            linguas-visiveis (when-let [r (ef/from [:#resultado :> :div.visivel] (ef/get-attr :id))] 
                 (-> r 
                  list 
                  flatten))] 
           (ef/at "#resultado" (ef/append (ef/from lingua-selector identity))) 
           (ef/at lingua-selector (ef/remove-class "invisivel")) 
           (ef/at lingua-selector (ef/add-class "visivel")) 
           (map #(do 
             (ef/at (str "#" %) 
               (ef/add-class %2)) 
             (map (fn [cor] 
               (ef/at (str "#" %) 
                 (ef/remove-class cor))) 
               (remove #{%2} cores))) 
             linguas-visiveis cores)))))) 

(set! (.-onload js/window) 
    aviso-seleciona) 

棘手的部分是在地圖上。我想從一些div元素中刪除一些css類,並在這些元素上添加一些其他元素。但它不起作用。除此之外,表單中的所有其他元素都在工作。但是,如果我將表單複製並粘貼到連接到該頁面的repl上並運行代碼,則按預期工作。我嘗試對部分代碼進行評論,以瞭解發生了什麼但沒有希望。

回答

1

我注意到你正在做的副作用在map,這是行不通的,因爲map是懶惰的,也就是說,它不會評價,除非您嘗試使用序列它產生,這就解釋了爲什麼它工作在REPL,但不在瀏覽器中。

對於最快和最髒的修復,請嘗試使用dorun來強制評估您的序列:(dorun (map #(do ......)

,或者慣用,重寫代碼,以類似的東西的(這是不是很地道):

(doseq [[el cor-to-add] (map vector linguas-visiveis cores)] 
    (ef/at (str "#" el) 
     (ef/add-class cor-to-add)) 
    (doseq [cor-to-remove (remove #{cor} cores)] 
    (ef/at (str "#" el) 
      (ef/remove-class cor-to-remove))) 
) 

或本,從每個元素移除所有類,第一:

(doseq [el linguas-visiveis 
     cor cores] 
    (ef/at (str "#" el) 
     (ef/remove-class cor))) 

和稍後僅添加所需類別:

(doseq [[el cor] (map vector linguas-visiveis cores)] 
    (ef/at (str "#" el) 
     (ef/add-class cor))) 
相關問題