On Tue, May 20, 2014 at 7:55 PM, Thiago H de Paula Figueiredo <
thiag...@gmail.com> wrote:

 Well, that makes sense (as well as explains why providing variable
>> instance in submit context doesn't help). Event is handled by an instance
>> of the
>> component with state corresponding to the last iteration of the loop.
>>
>
> The point here is that you just cannot rely on a loop variable after
> rendering or in event (including form submission) requests. So, in this
> case, you need to pass it to the context of the Submit component so you can
> set it again. Something like this, supposing the loop variable is an entity:
>
> <t:submit t:id="submitControl" value=".." t:context="loopVariable.id"/>
>
> void onSelectedFromSubmitControl(Long id) {
>         loopVariable = findById(id); // retrive the original object from
> the id
>         ...
> }
>
> Is this what you tried? If not, could you at least provide an overview of
> that? Otherwise, I cannot help you further.


Yes, this is it. I have a component which is looped over.

class MyComponent {
   @Parameter
   private MyObject obj; // assigned inside a loop

   void onSelectedFromSubmitControl ( ... ) {
   }
}

1) initially I tried to simply use MyObject instance passed as a parameter
inside AjaxFormLoop;
2) then, I tried to pass this instance as t:submit context, getting the
same results
3) finally, I tried to use obj.id as a context parameter instead - again,
onSelectedFromSubmitControl was being called with context parameter
belonging to the last iteration of the outside loop

At this point I gave up and solved the problem otherwise, without having to
rely on t:submit context.

I guess I understand your point, but t:submit does not encode context
inside submission URL (unlike t:actionlink or t:eventlink). Probably that's
the reason why my initial approach didn't work.

In fact, when t:submit is being used inside a loop and IS NOT ENCLOSED BY
OTHER COMPONENT, this scheme works. For example, in the same application I
have constructs like:

<t:ajaxformloop>
  <t:submit t:id="someId" p:context="loopContext"/>
</t:ajaxformloop>

That works as expected (and just like you described it should work).

But, if we replace it with

<t:ajaxformloop>
  <t:mycomponent/>
</t:ajaxformloop>

and t:submit is placed INSIDE t:mycomponent, we have a problem I've just
described. I'm not sure if it's indeed a Tapestry bug or it's just not
intended to work this way.

-- 
Ilya Obshadko

Reply via email to