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