Well, that was fun. Sort of. I did get it working by setting volatile="true" for the loop. It did leave me scratching my head wondering about the interactions of Persist and volatile.
Odd. > -----Original Message----- > From: Andy Pahne [mailto:[EMAIL PROTECTED] > Sent: Thursday, October 23, 2008 14:01 > To: Tapestry users > Subject: Re: [T5] editing a looped list of objects' properties in a form > > Jonathan Barker wrote: > > Perhaps you could post your full template and class. I don't see a > submit > > component so I question what else has been omitted. > > > > Jonathan > > > > > > I omitted a few things that seemed unimportant to me. But here it is > complete, only some names obfuscated...: > > <t:layout xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" > bodyID="template_inc.unterkuenfte" > features="none"> > > > > <div id="inner_content"> > > <div class="clearfix abstand15"> > <div id="heading_plus_description"> > <h2>${message:page-header}</h2> > <p>${message:intro}</p> > </div> > </div> > > > <!-- Show Error here --> > <t:if test="errorMessage"> > <div class="error"> > <span class="errorMessage">${errorMessage}</span> > </div> > </t:if> > > > <h3>${message:party-form}</h3> > > <form t:type="Form" > t:id="search_accommodation" > t:clientValidation="false" > t:autofocus="false"> > > > <t:loop source="passengers" value="passenger"> > > <fieldset class="column first"> > <legend>${message:firstName-label}</legend> > <input type="text" > t:type="TextField" > t:value="passenger.firstName" > t:validate="required,minLength=2" > t:id="firstName"/> > </fieldset> > > > <fieldset class="clear"> > <legend class="hidden">clear</legend> > </fieldset> > > > </t:loop> > > > > <fieldset id="search_accommodation_submit_wrapper"> > <legend>${message:legend-next-step}</legend> > <button > id="search_accommodation_submit"><span>${message:next- > step}</span></button> > </fieldset> > > </form> > > > > > > </div> > > > > > </t:layout> > > > > > > /** > * Copyright 2006-2008, Elmar Food > */ > package app.package.tb.web.pages.data; > > import java.util.ArrayList; > import java.util.List; > > import app.package.bo.passenger.Passenger; > import app.package.tb.web.base.ApplicationBasePage; > > import org.apache.log4j.Logger; > import org.apache.tapestry5.annotations.BeforeRenderTemplate; > import org.apache.tapestry5.annotations.BeginRender; > import org.apache.tapestry5.annotations.Persist; > import org.apache.tapestry5.annotations.Property; > > /** > * collect names and ages of travellers > * > * @author elmarfood > */ > public class AcmePassengers extends ApplicationBasePage{ > > /** log4j Logger */ > @SuppressWarnings("unused") > private static final Logger LOG = > Logger.getLogger(AcmePassengers.class); > > > @Property @Persist > private List<Passenger> passengers; > > @Property > private Passenger passenger; > > @BeforeRenderTemplate > public void initialize() { > > if(!getSearchOptionsExist()) { > // TODO error handling > throw new RuntimeException("no searchOptions"); > } > > initPassengerList(); > > } > > > private void initPassengerList() { > > int passengersTotal = getSearchOptions().getPassengersTotal(); > > if(passengers == null) { > passengers = new ArrayList<Passenger>(passengersTotal); > for (int i = 0; i < passengersTotal; i++) { > passengers.add(new Passenger()); > } > } > > > } > > > public void onSuccess() { > > LOG.info("onSuccess()"); > > int passengersTotal = getSearchOptions().getPassengersTotal(); > > for (int i = 0; i < passengersTotal; i++) { > System.out.println("Passenger '"+i+"'" + ": " + > passengers.get(i).getFirstName()); > } > > } > > > } > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]