I would definitely agree that Tapestry has a problem dealing with complex
Ajax pages.  Essentially, for Tapestry to do the right thing, it has to
have a model of what's going on in the client browser and no such model
exists.

Passing a page context and an individual event context helps, but you start
getting into scenarios where there's a context for the Zone and a context
for the link/form inside the Zone.

Past a certain point, it simply feels like we're trying to plug the holes
in the leaky dike.

I think the correct way forwards is to say that Tapestry's built-in Ajax
support is great for simple to low-moderate complexity ... but if you are
doing something very dynamic, it is not the best approach. Moving complex
UI logic to the client is the right approach, and the challenge is to
figure out how to move Tapestry and it's community in that direction.


On Thu, Mar 13, 2014 at 7:32 PM, Geoff Callender <
[email protected]> wrote:

> To all Tapestry devs,
>
> Please, I want your thoughts before I file a JIRA, just in case I have my
> wires crossed.
>
> I'm thinking that Tapestry has real problems working with complex AJAX
> pages because there are AJAX components that don't have a context
> parameter.
>
> The problem I see is that a deeply nested component, C, cannot handle an
> event from an AJAX sub-component unless C can reconstruct its context, ie.
> C has to be able to restore its parameters. This has been solved in Form
> and EventLink by giving them a context parameter. eg.
>
>     onPrepareForSubmit(Integer contextArg1) { etc. }
>
>     onMyevent(Integer contextArg1) { etc. }
>
> I routinely use this context to restore C's parameters, eg.
>
>     @Parameter
>     private Integer parameter1;
>
>     onPrepareForSubmit(Integer parameter1) {
>         this.parameter1 = parameter1;
>     }
>
> But what about Select and Grid? Neither of them has a context.
>
> Without a context, C can't handle 2 or more AJAX Select components. When
> one sends an event, C has no idea of the value of the other, nor of its own
> parameters. A context would fix all of this.
>
> Without a context, an inplace request from a GridPager can't remind C was
> currently selected or how the Grid was being filtered. The same goes for
> Grid column select events. (See
> https://issues.apache.org/jira/browse/TAP5-2297)
>
> There are workarounds, but with a context I think we wouldn't need them:
>
> 1. Use @Persist. Well, we all try to avoid this.
>
> 2. Include C's parameters in the page's context and make sure they're
> passed down through every nested component down to C. But surely that's not
> reasonable. What if the page is concerned with a Hospital, but in it our
> components drill down through a Ward to a Patient and C is concerned with
> the Patient's Diagnosis. Does it really make sense to pass diagnosisId in
> through the page context and down through all the in-between components?
> Following this logic, we could end up with every parameter of every
> component in the page context.
>
> 3. Use activation request parameters, but it appears to me to be messy.
> @ActivationRequestParameters is only available at the page level, so again
> we have to pass them all the way down. Even if we do this, it's a nuisance
> to pass them all the way UP in the first place. And again we could end up
> with every parameter of every component being declared in the page.
>
> 4. Perhaps C can get and set request parameters by hand, but why? Isn't a
> context better?
>
> Am I seeing an issue that doesn't exist? Is there a better way?
>
> Cheers,
>
> Geoff
>



-- 
Howard M. Lewis Ship

Creator of Apache Tapestry

The source for Tapestry training, mentoring and support. Contact me to
learn how I can get you up and productive in Tapestry fast!

(971) 678-5210
http://howardlewisship.com

Reply via email to