[Seaside] still struggling with the confusing scripting API's

Chris Muller asqueaker at gmail.com
Sat Oct 31 16:04:18 UTC 2015


> One important thing to know is that the Seaside script generation api does not cover all possible Javascript expressions.

I wasn't sure, good to know.

> I believe it was never intended to cover the complete language either. We can, of course, always extend the possibilities.
>
> Our experience is that it does the job to glue Seaside-JQuery generated expressions to hand-written Javascript, or for small pieces of JS code.
> If it’s harder to write the JS code in Seaside, then you should not try to write it in Seaside ;) I mean: it’s not as succinct as the concrete syntax because we’re generating something like Javascript ASTs here.

True, but I am attracted to the idea of generating it via Smalltalk
messages because (1) I think that approach provides me easier
opportunities for factoring and reuse, plus (2) I don't end up with
"two languages", each with their own syntax, in one method, which
becomes VERY difficult to read and maintain because I can't use my
IDE's capability to "select expressions" inside (parens), [brackets],
'quotes', etc.

> I would definitely opt for this version:
>
>         html script with: (JSStream on: 'new MyJavascriptObject(document.getElementById(''#id1''))’)

One of my reservations about that is it bypasses the brush API, which
is not only the prescribed way to use Seaside, it also sets up some
state on the Canvas ('currentBrush') which might be needed..?

So, can I do that going through the Brush api?  Everything I try
causes the various HTML characters to be escaped...

> Alternatively, the following is possible by adding a simple convenience method:
>
>         html script with: ((html javascript create: (html javascript alias: 'MyJavascriptObject') withArguments: { (html javascript alias: 'document') call: 'getElementById' with: #id1 }))
>
> With JSObject>>create:withArguments: implemented as:
>
> create: anObject withArguments: aCollection
>         "new <anObject>(<aCollection>)"
>         ^ (anObject apply: aCollection) create

I think I like that..

> Depending on your use case, the other options are:
> - use handwritten javascript functions and call those from generated scripts, limiting the constructs you need to be generated to those that can be done well in Seaside
> - generate javascript strings instead of ASTs, as in my final code snippet.
> - write a complete wrapper library like how it’s done for jQuery to work with your Javascript library.
>
> Hope this helps

Indeed, thanks.


More information about the seaside mailing list