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

Reply via email to