On Tue, May 20, 2014 at 7:55 PM, Thiago H de Paula Figueiredo <
[email protected]> 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