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.

Reply via email to