Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Fixed bad links due to copy-paste from cwiki-test

Scrollbar

...

 

Excerpt
hiddentrue

How to make your custom component accept and pass on all unknown parameters to the underlying HTML element

...

Informal

...

parameters

...

Informal parameters are any additional parameters (aka HTML attributes) beyond the parameters those explicitly defined for a component using the @Parameter annotation.

Div
stylefloat:right; margin: 1em
titleRelated Articles
classaui-label
Content by Label
showLabelsfalse
showSpacefalse
titleRelated Articles
cqllabel = "parameters" and space = currentSpace()

Any component that closely emulates a particular HTML element should support informal parameters, because it gives users of your component the ability to easily add HTML attributes to the HTML that your component emits. You'll find that many most of the built-in Tapestry components, such as Form, Label and TextField, do exactly that.

...

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
languagejava
titleImg.java

@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
languagejava
titleImg.java

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
languagejava
titleImg.java
public class Img extends Any { ... }