[Seaside] how to render access to a JS argument variable?

Johan Brichau johan at inceptive.be
Mon Oct 12 07:49:05 UTC 2015


Hi Chris,

jQuery’s replaceWith accepts either an html string or a javascript function. I believe this is also true for the Seaside binding implementation.
Does the following code not do what you want?

 html script defer with:
          ((html jQuery id: buttonId) onClick:
               ((html jQuery id: replacementId) call: 'replaceWith' with: ajaxRequest asFunction)).

The JSObject>>render: method should always produce a string, as it is called when the object needs to be rendered on a stream. It does not produce a ‘javascript string’.
What you want is to construct a function and give it as an argument to the replaceWith function (see code above). Imho, that should work.

Johan

> On 10 Oct 2015, at 00:14, Chris Muller <asqueaker at gmail.com> wrote:
> 
> Wow, all I need to do is work up an email question, and it seems to lead myself to a solution!   :-)   In this case, I can't use JQueryInstance>>#replaceWith: only lets the user pass a String argument, not a jQuery argument.  Because the version of JSObject>>#render: always returns a String no matter what, which will never let a JSObject subclass render its code onto the stream.  Strange!
> 
> And, so, the solution was to #call: 'replaceWith' with: myJQPost myself.  Here is the code, for comparison to the original:
> 
>      html script defer with:
>           ((html jQuery id: buttonId) onClick:
>                ((html jQuery id: replacementId) call: 'replaceWith' with: ajaxRequest) asFunction).
> 
> I think this is slowing my learning of Seaside -- the thought that I should be able to use all the convenience methods and get all the power of JQuery, but, in fact, some of these methods provide no way to render the other versions of the jQuery calls which take different argument types.  Only the string types are supported.  Am I right about this?
> 
> Another example is the "data" argument of a $.ajax(...) request.  Seaside renders a Javascript array, but then calls .join("&") on it!  Strings only....  :(
> 
> 
> On Fri, Oct 9, 2015 at 4:52 PM, Chris Muller <asqueaker at gmail.com <mailto:asqueaker at gmail.com>> wrote:
> Thanks Johan, that's the kind of advice I need, as there are many ways to do things.
> 
> Now, I am stumped (for hours!) on another very similar problem, except instead of a single variable, I simply want to pass an argument of type "jQuery" into jQuery's replaceWith() function, called within a onClick handler method.  So, in my renderContentOn:, I wrote:
> 
>      | ajaxRequest |
>      ajaxRequest := (html jQuery post
>           url: html actionUrl;
>           dataType: 'html') html: [  : replaceHtml | self invoke.  replaceHtml render: resultWidget ].
>            ....
>      html script defer with:
>           ((html jQuery id: buttonId) onClick:
>                ((html jQuery id: replacementId) replaceWith: ajaxRequest asJavascript) asFunction).
> 
> However, as before, the argument to replaceWith() is being rendered as a Javascript string literal instead of the code itself.  (See red quotes, below, I want it to stop rendering those quotes!).
> 
>     $("#id3").click(function(){$("#id4").replaceWith("$.post(&quot;/puf&quot;,[&quot;_s=C8vA8l5UNoUsGTpf&quot;,&quot;_k=B_Wk6EYdovACqAgV&quot;,&quot;2&quot;].join(&quot;&amp;&quot;),&quot;html&quot;)")})
> 
> I tried many different variations, no success.  This must be something simple...
> 
> Thank you.
> 
> On Fri, Oct 9, 2015 at 2:25 AM, Johan Brichau <johan at inceptive.be <mailto:johan at inceptive.be>> wrote:
> Hi Chris,
> 
> I notice you figured out the use of #alias:
> 
> Use the JS generation facilities only when you need to *generate* code. For example, to embed a server-side callback or, in general, when the code can only be dynamically constructed.
> In your case, I would do the following:
> 
> (JSStream on: ‘console.log(event)’)
> 
> Just because you can write it in Smalltalk does not mean you should :)
> 
> Johan
> 
> ps: your contributions are in my inbox, I will process them asap
> 
> > On 09 Oct 2015, at 03:46, Chris Muller <asqueaker at gmail.com <mailto:asqueaker at gmail.com>> wrote:
> >
> > Found something.  JSAlias.
> >
> >>    html span
> >>         class: 'PufMessageWidget' ;
> >>         id: (self assureHtmlIdUsing: html) ;
> >>         onClick: ((html javascript logger call: 'log' with: 'event')
> >> asFunction: #('event')).
> >
> > I gave up on onClick: since I guess its better to set up event
> > bindings through jQuery's API.  This binding does what I want, no
> > syntax error.
> >
> >     html script defer with:
> >          ((html jQuery id: (self assureHtmlIdUsing: html)) onClick:
> >               ((html javascript logger call: 'log' with: (html
> > javascript alias: 'event')) asFunction: #('event'))).
> >
> > It seems like a pretty wordy way to write console.log(event), but the
> > intent reads clearly so, that's good..
> > _______________________________________________
> > seaside mailing list
> > seaside at lists.squeakfoundation.org <mailto:seaside at lists.squeakfoundation.org>
> > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside <http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside>
> 
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org <mailto:seaside at lists.squeakfoundation.org>
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside <http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside>
> 
> 
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/seaside/attachments/20151012/14b29422/attachment-0001.htm


More information about the seaside mailing list