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?action=diff&rev1=3&rev2=4 Page.tml {{{ <t:tmlToString t:count="5" t:id="tmlToString"> - <p:renderMe> + <p:renderMe> - <div>foo ${tmlToString.current} bar</div> + <div>foo ${tmlToString.current} bar</div> - </p:renderMe> + </p:renderMe> </t:tmlToString> }}} @@ -83, +83 @@ 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>'); }}} + Here is a slightly different example which uses the component's body block instead of a render command parameter. Note that tapestry's [[http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/ioc/services/TypeCoercer.html|TypeCoercer]] can coerce between [[http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/Block.html|Block]] and [[http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/runtime/RenderCommand.html|RenderCommand]] + + Page.tml + {{{ + <t:alertBody t:count="5" t:id="alertBody"> + <div>${alertBody.current}</div> + </t:alertBody> + }}} + + Page.java + {{{ + @InjectComponent + @Property + private AlertBody alertBody; + }}} + + AlertBody.java + {{{ + public class AlertBody { + @Property + @Parameter(defaultPrefix=BindingConstants.LITERAL, required=true) + private int count; + + @Property + private int current; + + @Inject + private JavaScriptSupport javaScriptSupport; + + @Inject + private ComponentResources componentResources; + + @Inject + private TypeCoercer typeCoercer; + + 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; + Block body = componentResources.getBody(); + RenderCommand bodyRenderCommand = typeCoercer.coerce(body, RenderCommand.class); + queue2.push(bodyRenderCommand); + } + }); + } + // commands are pushed to the front of the queue + Collections.reverse(commands); + for (RenderCommand command : commands) { + queue.push(command); + } + } + }; + } + + @BeforeRenderBody + boolean beforeRenderBody() { + // we are explicitly rendering the body in beginRender so do not render it implicitly + return false; + } + + @AfterRender + void afterRender(MarkupWriter writer) { + writer.end(); + String html = wrappingDiv.getChildMarkup(); + wrappingDiv.remove(); + javaScriptSupport.addScript("alert('%s')", html); + } + } + }}} + + Result + {{{ + alert('<div>0</div><div>1</div><div>2</div><div>3</div><div>4</div>'); + }}} + --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
