Hmmm....But that only causes more confusion I'm afraid :(
Ohhhhhh....I think what you are doing sort of sounds right, but you still
can't expect the For component to be able to know the difference between all
of your objects if the equals() method on them doesn't enforce some sort of
uniqueness.
Have you tried playing with the "match" parameter to For? I've normally used
the "ListEdit" component for things like this in the past. Would love to
hear if "match" or some of the other parameters solve your problem.
On 1/26/06, Chris Conrad <[EMAIL PROTECTED]> wrote:
>
> Sorry to reply twice, but I thought some code snippets might make
> things clearer. Here is what I do in my pageBeginRender:
>
> rsvpList = new ArrayList<Rsvp>(numberAttending);
>
> for (int i = 0; i < numberAttending; i++) {
> Rsvp rsvp = new Rsvp();
> rsvp.setId(i);
> rsvp.setAttending(true);
>
> rsvpList.add(i, rsvp);
> }
>
> setRsvpList(rsvpList);
>
> My listener method looks like:
>
> // Reset the ids to 0
> List<Rsvp> rsvpList = getRsvpList();
> for (Rsvp rsvp : rsvpList) {
> rsvp.setId(0);
> }
>
> getRsvpData().setRsvpList(rsvpList);
>
> And then in my HTML template I use it like this:
>
> <div jwcid="@For" source="ognl:rsvpList"
> value="ognl:currentRsvp">
> <div jwcid="@Any" element="div" class="ognl:evenOdd.next">
> <p class="floatLeft">
> <label jwcid="@FieldLabel"
> field="component:guestName">Guest's Name</label>
> <input jwcid="guestName" size="30"/>
> </p>
>
> <p class="floatLeft">
> <label jwcid="@FieldLabel"
> field="component:meal">Meal</label>
> <input jwcid="meal"/>
> </p>
> <br class="clear"/>
> </div>
>
> The bit that bothers me is that in my pageBeginRender I need to do this:
> rsvp.setId(i);
>
> and in my listener I need to do this:
>
> // Reset the ids to 0
> List<Rsvp> rsvpList = getRsvpList();
> for (Rsvp rsvp : rsvpList) {
> rsvp.setId(0);
> }
>
> I need to do that exclusively so that the For component can update
> the List correctly.
>
> Hopefully that makes things a little clearer.
>
> --Chris
>
> On Jan 26, 2006, at 11:58 AM, Jesse Kuhnert wrote:
>
> > Hmmm. .
> >
> > I do these sort of things a lot, esp. with hibernate. I've found
> > the For
> > component to incredibly useful, but maybe the identification of
> > objects part
> > could be made more clear?
> >
> > I think the PropertySelectionModel problem could be solved if you
> > used the
> > "BeanPropertySelectionModel" class found in
> > http://tacos.sourceforge.netinstead. It makes turning a list of
> > hibernate objects into the selection
> > model a one-line argument.
> >
> > Let me know if you try that and still find problems.
> >
> > On 1/26/06, Chris Conrad <[EMAIL PROTECTED]> wrote:
> >>
> >> Hello everyone,
> >>
> >> I'm working a tiny little RSVP for a friend. While doing so I found,
> >> what seems to me at least, a very non-intuitive result from the For
> >> component. Basically the behavior I want is:
> >>
> >> 1. The user navigates to the RSVP page and is provided a drop down
> >> box to select the number of people who will be attending the event.
> >>
> >> 2. The user is given a list of text entry boxes (to enter the name of
> >> the guest) and drop downs (to select the meal the guest wants).
> >>
> >> 1 was simple to accomplish though having to create a
> >> PropertySelectionModel is kinda a pain for something this simple.
> >> Where things got hairy is 2. Basically the code flow is: in the
> >> listener for the form submit in #1, I grab the number of guests
> >> attending and set that on the meal selection page. The meal
> >> selection page's pageBeginRender creates a List of x RSVP objects
> >> where x is the number of guests attending. Then the meal selection
> >> page uses a For component to loop through the List of RSVP objects so
> >> that, in the first pass everything is blank and then when the guest
> >> submits, those RSVP objects in the List get filled in with the
> >> details the guest entered.
> >>
> >> Now, what actually happened is the first RSVP object in the list is
> >> continually updated over and the others are never touched. When
> >> tracing through the For components code, it appears to be trying to
> >> match the serialized object saved in the form against the ones in the
> >> List to "intelligently" pick which one to update. But since all of
> >> the RSVP objects were the same to start with, and the For component
> >> doesn't update it's internal mapping after updating an object, it
> >> just ignored everything in the list after the first item. Or, I
> >> guess more accurately, it continually matched the first item in the
> >> List and so it just repeatedly updated that one RSVP object. To work
> >> around this, I needed to set the RSVP's id in the pageBeginRender to
> >> a different value for each RSVP object and then reset them back to 0
> >> just before sending them to Hibernate to persist (if I don't reset
> >> them to 0, Hibernate things it's a detached object and ends up
> >> updating a row instead of adding a new row).
> >>
> >> This work around seems very much like a hack to me. Is there a way
> >> to make the For component do the right thing (i.e. actually iterate
> >> over the array when rewinding instead of assuming it knows what it's
> >> doing)? I did try playing with the match parameter and that
> >> completely breaks everything, none of the objects in the List get
> >> updated. It seems that my use case isn't so terribly strange that it
> >> would be this difficult to accomplish in Tapestry.
> >>
> >> Thanks,
> >> --Chris
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >> For additional commands, e-mail: tapestry-user-
> >> [EMAIL PROTECTED]
> >>
> >>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>