Can you put this up in the Tapestry Wiki? It's trivial to do and IMHO very useful On Mar 14, 2012, at 8:11 AM, Lance Java wrote:
> Hi people, there have been a few threads around lately about getting the > HTML string from a block / render command on the serverside including: > > http://tapestry.1045711.n5.nabble.com/Rendering-components-in-Alerts-td5543434.html > http://tapestry.1045711.n5.nabble.com/How-does-MultiZoneUpdateEventResultProcessor-get-a-html-string-from-a-RenderCommand-td5518968.html > > http://tapestry.1045711.n5.nabble.com/tml-parameter-rendered-into-a-JavaScript-string-td5512889.html > > I have come up with what I think to be the most elegant solution. > > Please find below the source for a component which does the following: > 1. Takes a count parameter and a render command parameter > 2. For each count, updates a "current" property which can be referenced by > the render command and adds the render command to the render queue > > 3. Removes the elements from the DOM in @AfterRender and uses the HTML in a > javascript alert > > Page.html > ======= > <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); > 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>"); > > > Cheers, > Lance. --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org