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]

Reply via email to