Hi,
I haven't used AjaxFormLoop, but with simple loop inside a form I use
SubmitNotifier, like this:
<t:form>
<t:loop source="items" value="item">
<t:submitnotifier t:id="main">
<a t:type="linksubmit">Submit</a>
</t:submitnotifier>
</t:loop>
</t:form>
Then in your code declare:
public void onAfterSubmitFromMain() {
// work with current item here
}
Haven't tried with submit in nested component though, but I can imagine
AfterSubmit won't be triggered in nested component because of event
bubbling -- it bubbles up, not down. But I might be wrong here.
On Tue, May 20, 2014 at 9:45 PM, Ilya Obshadko <[email protected]>wrote:
> 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
>
--
Dmitry Gusev
AnjLab Team
http://anjlab.com