I am cobbling together my own little CLJS web framework and it is going 
well but I am stumped by one bit of interop: supporting event handlers that 
close over lexical variables. It seems to be a piece of cake for, inter 
alia, Reagent. Here is an excerpt from the "simple" example, hacked a bit 
(the "xxx" bits) to make sure I was seeing what I was seeing:

(defn color-input []
  (let [xxx (atom 0)]
    [:div.color-input
     "Time color: "
     [:input {:type      "text"
              :value     @time-color
              :on-change #(do (reset! xxx (rand-int 32767))
                              (println :xnow @xxx)
                              (reset! time-color (-> % .-target .-value)))}]]))


My approach is to convert the anonymous function to  a string via STR and 
specify it in the generate HTML as the handler. Just to see my html I have 
a little test code:

(let [xxx (atom 42)]
  (println :htm!!! (tag/to-html [(h1 {:onclick (on-evt #(swap! xxx inc))} 
"Help!")])))


Here is `on-evt`:

(defn on-evt [cbfn]
  (cl-format nil
                "(~a)(event)"
                (str cbfn)))


Here is what I see in the console:
:htm!!! <h1 onclick='(function (){return 
cljs.core.swap_BANG_.call(null,xxx_12780,cljs.core.inc);})(event)' 
id='0'>Help!</h1>

But JS understandably does not see the  "xxx_12780".

I have tried more than once digging into the reagent code to see how it is 
working its magic but always run into a dead end. 

The one thing I do see when I inspect the DOM in the Chrome debugger is 
that the handler is not there on the target element, just a react-id or 
some such. This makes me think that the anonymous function itself (happily 
compiled into JS closed over the lexical variable) is being stashed in a 
dictionary under the react-id and that a handler at the document level is 
navigating from the event target to the closure via the react-id.

That's just crazy enough to work. :) But am I just missing some simple CLJS 
interop capability? Any other ideas? 







-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to