...
Excerpt | ||
---|---|---|
| ||
How to make your custom component accept and pass on all unknown parameters to the underlying HTML element |
Div | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
|
...
In the example below we create an Img component, a custom replacement for the <img> tag. Its src parameter will be an asset. We'll use the @SupportsInformalParameters annotation to tell Tapestry that the component should support informal parameters.
Code Block | ||||
---|---|---|---|---|
| ||||
@SupportsInformalParameters public class Img { @Parameter(required=true, allowNull=false, defaultPrefix=BindingConstants.ASSET) private Asset src; @Inject private ComponentResources resources; boolean beginRender(MarkupWriter writer) { writer.element("img", "src", src); resources.renderInformalParameters(writer); writer.end(); return false; } } |
...
Another, equivalent, approach is to use the RenderInformals mixin (:
Code Block | ||||
---|---|---|---|---|
| ||||
public class Img { @Parameter(required=true, allowNull=false, defaultPrefix=BindingConstants.ASSET) private Asset src; @Mixin private RenderInformals renderInformals; void beginRender(MarkupWriter writer) { writer.element("img", "src", src); } boolean beforeRenderBody(MarkupWriter writer) { writer.end(); return false; } } |
This variation splits the rendering of the tag in two pieces, so that the RenderInformals mixin can operate (after beginRender() and before beforeRenderBody()).
Approach 3: Extend the "Any" component
Another approach is to have your component class extend Tapestry's Any component, which already supports informal parameters:
Code Block | ||||
---|---|---|---|---|
| ||||
public class Img extends Any { ... } |