You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by Apache Wiki <wi...@apache.org> on 2012/03/14 17:30:14 UTC
[Tapestry Wiki] Update of "Tapestry5HowToGetAnHTMLStringFromARenderCommandParameter" by uklance
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Tapestry Wiki" for change notification.
The "Tapestry5HowToGetAnHTMLStringFromARenderCommandParameter" page has been changed by uklance:
http://wiki.apache.org/tapestry/Tapestry5HowToGetAnHTMLStringFromARenderCommandParameter
New page:
Sometimes, you may want to specify a parameter in tapestry's markup language (TML) and instead of rendering the HTML directly to the response, you may wish to use it for some other purpose (eg use it in a javascript).
The following is an example of a component dose the following:
* Accepts a count parameter and a [[http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/runtime/RenderCommand.html|RenderCommand]] parameter
* Adds a wrapper div to the markup writer
* Loops through each count and updates a the "current" property which may be referenced in the RenderCommand parameter
* Renders the RenderCommand for each iteration through the loop
* Uses @AfterRender to get the resultant HTML from the wrapper div
* Removes the wrapper div from the markup so that it is not rendered to the response directly
Page.tml
{{{
<t:tmlToString t:count="5" t:id="tmlToString">
<p:renderMe>
<div>foo ${tmlToString.current} bar</div>
</p:renderMe>
</t:tmlToString>
}}}
Page.java
{{{
@InjectComponent
@Property
private TmlToString tmlToString;
}}}
TmlToString.java
{{{
public class TmlToString {
@Parameter
@Property
private RenderCommand renderMe;
@Property
@Parameter(defaultPrefix=BindingConstants.LITERAL, required=true)
private int count;
@Property
private int current;
@Inject
private JavaScriptSupport javaScriptSupport;
private Element wrappingDiv;
@BeginRender
RenderCommand beginRender() {
return new RenderCommand() {
public void render(MarkupWriter writer, RenderQueue queue) {
wrappingDiv = writer.element("div");
List<RenderCommand> commands = new ArrayList<RenderCommand>();
for (int i = 0; i < count; ++ i) {
final int finalI = i;
commands.add(new RenderCommand() {
public void render(MarkupWriter writer2, RenderQueue queue2) {
current = finalI;
queue2.push(renderMe);
}
});
}
Collections.reverse(commands); // render commands are pushed to the front of the queue
for (RenderCommand command : commands) {
queue.push(command);
}
}
};
}
@AfterRender
void afterRender(MarkupWriter writer) {
writer.end();
String html = wrappingDiv.getChildMarkup();
wrappingDiv.remove();
javaScriptSupport.addScript("alert('%s')", html);
}
}
}}}
Result
{{{
alert('<div>foo 0 bar</div><div>foo 1 bar</div><div>foo 2 bar</div><div>foo 3 bar</div><div>foo 4 bar</div>');
}}}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org