If you output your HTML as DOM nodes, rather than a string, you can just attach the function directly to the attribute.
On 11 October 2017 at 18:20, hiskennyness <kentil...@gmail.com> wrote: > 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. > -- James Reeves booleanknot.com -- 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.