[ https://issues.apache.org/jira/browse/TAP5-1918?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15198093#comment-15198093 ]
Thiago H. de Paula Figueiredo commented on TAP5-1918: ----------------------------------------------------- I believe that, if the target component implements {code}ClientElement{code}, we should take advantage of knowing what the client id (HTML id) is and using it with {code}markupWriter.getDocument().getElementById(clientElement.getClientId()). When it's not, then the only guaranteed way of implementing this I can think of is using a MarkupWriterListener and apllying the mixin logic to the first element generated by the component and throw an exception if none is generated. > RenderInformals mixin doesn't always work as expected > ----------------------------------------------------- > > Key: TAP5-1918 > URL: https://issues.apache.org/jira/browse/TAP5-1918 > Project: Tapestry 5 > Issue Type: Bug > Components: tapestry-core > Affects Versions: 5.3.1, 5.3.2, 5.3.3, 5.4 > Reporter: Lance > Priority: Minor > > The following code: > {code} > <div> > <t:beaneditform t:id="entity" ... t:mixins="RenderInformals" > data-foo="bar" /> > </div> > {code} > Results in the following HTML: > {code} > <div class="form-horizontal" data-foo="bar"> > <form ...> > </form > </div> > {code} > As you can see, the informal parameter was added to the div instead of the > form. > The current implementation of RenderInformals assumes that a component has > populated the MarkupWriter with an element in beginRender() which is not > always the case. I think it should be changed to use an afterRender() method > and add informals to the current element's last child. > eg: > {code} > @MixinAfter > @SupportsInformalParameters > public class RenderInformals > { > @Inject > private ComponentResources resources; > > void afterRender(MarkupWriter writer) > { > List<Node> children = writer.getElement().getChildren(); > if (!children.isEmpty()) { > Element lastChild = (Element) children.get(children.size() - 1); > for (String name : resources.getInformalParameterNames()) { > lastChild.attribute(name, resources.getInformalParameter(name, > String.class)); > } > } > } > } > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)