2014-04-17 2 views
0

Я использую enfocus для манипуляции dom в ClojuseScript.Обработка событий в 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) 

Хитрая часть находится в карте. Я хочу удалить некоторые классы CSS из некоторых элементов div и добавить некоторые другие элементы. Но это не работает. Все остальные элементы в форме работают, кроме этого. Но если я копирую и вставляю форму в реплику, связанную с этой страницей, и запускаю код, он работает так, как ожидалось. Я попытался прокомментировать части кода, чтобы понять, что происходит, но без надежды.

ответ

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))) 
Смежные вопросы