[Seaside] still struggling with the confusing scripting API's
Johan Brichau
johan at inceptive.be
Fri Oct 30 19:49:34 UTC 2015
There’s a better version:
html script with: ((html javascript alias: 'MyJavascriptObject') createWithArguments: { (html javascript alias: 'document') call: 'getElementById' with: #id1 })
with the implementation of JSObject>>createWithArguments as follows:
createWithArguments: aCollection
"new <self>(<aCollection>)"
(self apply: aCollection) create
We could add these to Seaside 3.2
I think they make sense for generating those pieces of code in a more succinct way.
Johan
> On 30 Oct 2015, at 20:45, Johan Brichau <johan at inceptive.be> wrote:
>
> Hi Chris,
>
> It is *possible*:
>
> html script with: ((html javascript alias: 'MyJavascriptObject') apply: { (html javascript alias: 'document') call: 'getElementById' with: #id1 }) create
>
> One important thing to know is that the Seaside script generation api does not cover all possible Javascript expressions.
> 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.
> I would definitely opt for this version:
>
> html script with: (JSStream on: 'new MyJavascriptObject(document.getElementById(''#id1''))’)
>
> 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
>
> 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
> Johan
>
>> On 30 Oct 2015, at 17:52, Chris Muller <ma.chris.m at gmail.com> wrote:
>>
>> I'm still trying to get my head around "what is the best way to write
>> javascript in Seaside. I just spent an entire morning and still
>> failed to write the simplest expression via an aggregation of
>> Seaside's JSDecoration's. This is what I want to render:
>>
>> new MyJavascriptObject(document.getElementById("id1"))
>>
>> Using Seasides various brushes and canvas API, I could not even get
>> the first two words right. I tried:
>>
>> html script with: (html javascript create access: 'MyJavascriptObject'))
>> html script with: (html javascript create add: 'MyJavascriptObject'))
>> html script with: (html javascript create alias: 'MyJavascriptObject'))
>> html script with: (html javascript create assign: 'MyJavascriptObject'))
>>
>> None of those produce "new MyJavascriptObject", what am I missing?
>> Its almost like there is a missing JSDecoration or capability missing
>> from JSStatement..?
>>
>> After throwing up my hands with that, I decided to try "hard coding"
>> the Javascript strings into my Seaside rendering methods:
>>
>> html script with: (html javascript script: [ : s | s add: 'new
>> MyJavascriptObject(document.getElementById("', (aPufDomainComponent
>> htmlId),'") ])
>>
>> which produces:
>>
>> new MyJavascriptObject(document.getElementById(\"id1\")
>>
>> So that is pretty much what I want, but see that it is escaping the
>> quote characters, which makes it hard to read in the browser. Are
>> those necessary or is there some way to avoid that?
>>
>> I wanted to avoid having to put big chunks of hardcoded Javascript
>> strings into my Smalltalk code. Any advice is appreciated.
>>
>> - Chris
>>
>> PS -- I think the inconsistency of the API is part of my struggle.
>> JSObject script: can accept a Block, and WAHtmlCanvas>>#script: SAYS
>> it takes "aBlock", but that HAS to be wrong, because
>> WAScriptTag>>#with: ends up writing the Block's "greaseString" to the
>> stream...
>>
>> thanks.
>> _______________________________________________
>> seaside mailing list
>> seaside at lists.squeakfoundation.org
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
More information about the seaside
mailing list