On Wednesday, October 11, 2017 at 1:23:36 PM UTC-4, James Reeves wrote:
>
> If you output your HTML as DOM nodes, rather than a string, you can just 
> attach the function directly to the attribute.
>

It just occurred to me that one advantage of the string approach is that 
the initial page load is simply of one big wodge of HTML. I am no expert on 
this stuff, but somewhere I saw a mention that this was optimal.

If I build individual DOM nodes so I can attach listeners, I then also have 
to assemble them into the final structure. 

Is that right? Will that be slower? 

Thx!

 

>
> On 11 October 2017 at 18:20, hiskennyness <kent...@gmail.com <javascript:>
> > 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 clo...@googlegroups.com 
>> <javascript:>
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com <javascript:>
>> 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+u...@googlegroups.com <javascript:>.
>> 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