[Seaside] what I think I've learned about children

Sebastian Sastre ssastre at seaswork.com
Sun Dec 30 17:14:37 UTC 2007


Hi Randal,

	just a couple of details. See below..

> -----Mensaje original-----
> De: seaside-bounces at lists.squeakfoundation.org 
> [mailto:seaside-bounces at lists.squeakfoundation.org] En nombre 
> de Randal L. Schwartz
> Enviado el: Sábado, 29 de Diciembre de 2007 15:10
> Para: Seaside - general discussion
> Asunto: [Seaside] what I think I've learned about children
> 
> 
> In the past few days, I've done two things.
> 
> First, I spent about a day going through the prior 11000(!) 
> messages in this mailing list.  Sure, I killed entire threads 
> once I saw what the discussion was about, and I *think* I got 
> pretty good at ignoring the things that were no longer 
> accurate because the methodology has changed.  But it was 
> rather enlightening, and I'm glad I did it.
> 
> Second, I created a blog at 
> http://methodsandmessages.vox.com/ specifically for my public 
> postings about Smalltalk, and Squeak and Seaside in particular.
> 
> Since I just posted here about children, I wanted to post 
> what I think I know about children now, to see if I'm 
> confused about anything, and maybe to make up some FAQ 
> material, both for my blog, and for the seaside.st FAQ.
> 
> So, please correct me!
> 
> * The rendering process is a hierarchy of WAComponent-derived objects,
>   one of which has been designated as the "root" in the configuration.
> 
> * Each component must answer its immediate children in the tree by
>   overriding #children:
> 
Yes, and it can answer more children (like dinamically discarded children)
than the ones that it will actually is rendering. Sounds a feature unlikely
to be needed but I used it once and was important exactly like that.

>   children
>     ^ Array with: topnav with: leftnav with: body.
> 
> * Each component should render its immediate children 
> somewhere in its own
>   render method by calling #render: on the canvas:
> 
>   renderContentOn: html
>      ...
>      html render: topnav.
>      ...
>      html render: leftnav.
>      ...
>      html render: body.
>      ...
> 
I think is the more often scenario, but nothing stops you making a component
rendered twice. A parent can render a deeper sub children even when another
children renders that (repeated) one.

> * A component can temporarily replace itself with a 
> *different* component
>   with #call:.  This should *not* be done as part of the 
> render, because
>   that would be some sort of weird brundlefly experiment.  
> Instead, it will
>   always be as part of a callback:
> 
>   renderContentOn: html
>     ...
>     html anchor callback: [self call: self newbody]; with: 'go here'.
>     ...
> 
>   newbody
>     ^[a different component component]
> 
>   When the anchor is selected, a new render (from the top) 
> will be performed,
>   with the component that called #call: temporarily replaced 
> with the result
>   of #newbody.  It should have its own #renderContentOn:, 
> #children, and so
>   on.  When the component returned by #newbody wants to pop 
> the stack, it
>   calls #answer or #answer: (from a callback!) and the 
> original component will
>   appear again.
> 
> * Use #call: only when you will be coming back.  You can also 
> just change
>   the components instead, if it's unidirectional rather than 
> call and return:
> 
>   initialize
>     super initialize.
>     body := self body1. "set up the initial component"
> 
>   children
>     ^ Array with: body. "don't forget this!"
> 
>   renderContentOn: html
>     ...
>     html anchor callback: [body := self body1]; with: 'first body'.
>     html anchor callback: [body := self body2]; with: 'second body'.
>     ...
>     html render: body. "render the current body"
>     ...
> 
>   Now, picking one of the two links will select which "body" 
> gets rendered.
>   No #call: is needed, because we don't need to stack the 
> states to return
>   to it.
> 
Maybe is "just in case" or "code clean" policy but I still prefer use to use
call: for those cases.


> How did I do?  Would the seaside.st people like me to edit 
> this directly into the FAQ there?  Thanks.
> 

I'm glad to hear someone making this clarifications. Great summary Randal.
All the best with your blog,

Cheers,

Sebastian


> --
> Randal L. Schwartz - Stonehenge Consulting Services, Inc. - 
> +1 503 777 0095 <merlyn at stonehenge.com> 
> <URL:http://www.stonehenge.com/merlyn/>
> Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
> See PerlTraining.Stonehenge.com for onsite and 
> open-enrollment Perl training!
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside



More information about the seaside mailing list