Hi Geoff,

You can pass an instance of the RenderCommand that could capture the
context, hopefully this snippet can give a hint.

Regards,
Dmitry

for (int i = 0; i < emailIds.length; i++)
{
    String emailId = emailIds[i];
    boolean display = displayStatusArray[i];

    // Set tempId for getEmailStatusZoneId()
    tempId = emailId;

    // There may be multiple instances of this component being
refreshed at the same time,
    // so we need to render it immediately
    ajaxResponseRenderer.addRender(getEmailStatusZoneId(),
(RenderCommand) (writer, queue) -> {
        // Initialise before rendering
        EmailDeliveryStatus.this.tempId = emailId;
        EmailDeliveryStatus.this.show = display;
        setupEmail();

        ((RenderCommand) emailStatusZone.getBody()).render(writer, queue);

        initJavaScript();
    });
}



On Tue, Jan 3, 2023 at 2:47 PM JumpStart <
geoff.callender.jumpst...@gmail.com> wrote:

> Hi all,
>
> Let’s say I have loop around a zone, and on a particular event I want to
> render just the 2nd and 4th instances of the zone. How do I do that?
>
>         <t:loop source="1..10" value="zoneIndex">
>
>                 <t:zone t:id=“thingZone" id="prop:zoneId” >
>                         <!— Contents from thing goes here. —>
>                 </t:zone>
>
>         </t:loop>
>
>         @Property
>         private int zoneIndex;
>
>         @InjectComponent
>         private Zone thingZone;
>
>         public String getZoneId() {
>                 return “thingZone_" + zoneIndex;
>         }
>
> My problem is that the following does not correctly render thing 2 and 4.
>
>         public String onMyEvent() {
>
>                 thing = getThing(2);
>                 zoneIndex = 2;
>                 ajaxResponseRenderer.addRender(thingZone);
>
>                 thing = getThing(4);
>                 zoneIndex = 4;
>                 ajaxResponseRenderer.addRender(thingZone);
>
>                 thing = null;
>
>         }
>
> As you can see below, the response includes the right zone names, but the
> rendered content of them is the same and is based on whatever the final
> values were. In this case the final value of thing was null, so white space
> was rendered into both zones.
>
> {
>   "_tapestry" : {
>     "content" : [
>       [
>         “thingZone_4",
>         "\n\t\t\t\t\t\t\t\t\n\t\t\t\t"
>       ],
>       [
>         “thingZone_2",
>         "\n\t\t\t\t\t\t\t\t\n\t\t\t\t"
>       ]
>     ],
>     "inits" : [
>
> So addRender(ClientBodyElementZone zone) queues up the request for later.
> Can I somehow queue up each request with the current values that I want it
> to use when rendering?
>
> Cheers,
>
> Geoff



-- 
Dmitry Gusev

AnjLab Team
http://anjlab.com

Reply via email to