Re: still struggling with the confusing scripting API's

Johan Brichau <[email protected]>
Newsgroups gmane.comp.lang.smalltalk.squeak.seaside
Message-ID <[email protected]>
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 <[email protected]> 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 <[email protected]> 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
>> [email protected]
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.