Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Won't Fix
-
None
-
None
-
None
-
None
-
Tapestry 5.0.6-SNAPSHOT
Description
ComponentPageElementImpl is responsible for calling the render
phase methods of the components. It calls the setupRender method
on the attached Mixins then the components and then the Mixins that
have a @MixinAfter annotation. If in this phase the setupRender of a
Mixin returns a boolean value that will be saved into the Event object and
in case of a "false" the setupRender calls of the subsequent components
will be aborted.
During the "inverse" lifecycle the order is simply reversed and the render
phase method of the Mixin with @MixinAfter annotation is called, then
the render phase method of the component and then the method of the
Mixin is called. The problem is now that the "inverse" render phase
methods are getting called without checking whether the corresponding
other render phase methods have been executed.
So in my case the cleanupRender method of the Form component gets
called although i have short-circuited the beginRender method with my
Mixin because there is no state available that indicates that the beginRender
method of the Form component has NOT been executed.
private void invoke(boolean reverse, ComponentCallback callback)
{
....
Iterator<Component> i = reverse ?
InternalUtils.reverseIterator(_components)
: _components.iterator();
while (i.hasNext())
callback.run(i.next());
A possible solution would be to create a List that contains those
components whose render phase methods really have been
executed. This list is then used in the "inverse" lifecycle.
see also:
http://www.nabble.com/T5%3A-Mixin-on-Form-does-not-work-as-expected-tf4562001.html
http://www.nabble.com/T5%3A-Mixin-on-Form-does-not-work-as-expected-tf4562724.html