[
https://issues.apache.org/jira/browse/TAPESTRY-1805?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12532584
]
Kristian Marinkovic commented on TAPESTRY-1805:
-----------------------------------------------
hi nick,
the point is why should a inverse render phase method of a nested component be
called if the component has not be rendered or the corresponding render phase
method has not been called.
so... why call cleanupRender if setupRender has not been called? :) if you
return false on beginRender the beforeRenderRemplate won't be called either.
i don't think components should be aware of short-circuiting... makes it just
harder for developers
g,
kris
p.s.
the quick solution for me was to make the cleanupRender method of the Tapestry
Form component public and to create an own Form component by extending Tapestry
Form. This Form component overrides cleanupRender after it checked the
Environment with peek
> Reverse ordering/exceution of page render phase methods (afterXXX and
> cleanupRender) incorrect when short-circuiting
> --------------------------------------------------------------------------------------------------------------------
>
> Key: TAPESTRY-1805
> URL: https://issues.apache.org/jira/browse/TAPESTRY-1805
> Project: Tapestry
> Issue Type: Bug
> Components: tapestry-core
> Affects Versions: 5.0.6
> Environment: Tapestry 5.0.6-SNAPSHOT
> Reporter: Kristian Marinkovic
> Priority: Critical
>
> 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
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]