[Seaside] Repainting during AJAX callbacks
leves at elte.hu
Fri Sep 3 22:23:42 UTC 2010
On Fri, 3 Sep 2010, C. David Shaffer wrote:
> Before I get too far let me say that I don't know, yet, whether this is
> an unnecessary hack or a worthwhile framework. I'm using it now and
> like it but I'd be happy to replace it with something better is people
> can tell me what that better thing is :-).
> Here's the problem: During an AJAX callback (request, update or script)
> sometimes a component unrelated to the one making the callback needs to
> be repainted. Normally this happens as the result of an announcement.
> While announcements serve to decouple the components they also prevent
> the source of the announcement from knowing to cause this other
> component to paint.
> Basically this motivates using Comet but I don't like Comet and find
> that I don't need Comet's level of "server push" for any of my
> applications. What I need is simply the way tack a little extra
> My solution: Repaintable in the Cincom Public Store Repository. (This
> package uses JQuery.) It is a very simple framework so easily abandoned
> if it is the wrong thing to do :-) Here's how it works: Components
> subclass RPRepaintable (or you merge RPRepaintable's methods into your
> component hierarchy if that isn't possible). You must also use
> RPSession or a subclass as your session class for your application.
> response to an AJAX request it:
> self repaint: 'some-jquery-selector' using: [:h | "h is a canvas"]
> The block with be invoked with a canvas. Paint on it was you normally
> would. Its contents will be loaded by jQuery into the element(s)
> indentified by 'some-jquery-selector' (normally an element id).
> To simplify things, if the component wants to be able to completely
> repaint itself it can implement the following trio of methods:
> renderContentOn: html
> html div
> id: self contentId;
> with: [self paintOn: html]
> paintOn: html
> html text: 'Put your normal renderContentOn: stuff here'
> Then, such a component just has to send itself #repaint to repaint its
> contents. So, suppose you receive an announcement and you want to
> repaint yourself. Just do "self repaint". Its that simple. It works
> whether the original AJAX request was "script" or "html" type. Sending
> #repaint (#repaint:using) during a full-page repaint (normal HTTP
> request) does nothing...your component will be painted during the render
> phase anyway so normally this is not a problem.
> An example is provided in the Public Store Repository
> (Repaintable-example). Some notes:
> 1) All AJAX requests must either be dataType 'script' or 'html'. This
> means that cases when you don't render anything like:
> html div
> onClick: ((html jQuery: #foo) ajax callback: [self foo])
> will have to modified to
> html div
> onClick: ((html jQuery: #foo) ajax dataType: 'script'; callback:
> [self foo])
> I think that this this is the result of a bug in Repaintable but I can't
> tell. In practice 99% of my AJAX requests are either html: or script:
> requests anyway. In those cases you don't need to send dataType:.
> 2) If you are using AJAX for purposes other than sending back HTML or
> :-) as components try to repaint themselves. This isn't a problem for
> me but it might be for those of you using JSON to transfer data etc.
> This could be fixed if it becomes a problem for anyone.
> So, garbage or pure genius (I know the answer already as it took me
> three attempts to spell genius)?
:) This is how our AX framework worked (AXAnnouncements were extracted
from that). The demo is still available here:
> seaside mailing list
> seaside at lists.squeakfoundation.org
More information about the seaside