You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by Ulrich Stärk <ul...@spielviel.de> on 2008/02/26 22:46:26 UTC

T4 EventListeners and formSubmit

I'd like to bring up an issue I already posted to the user mailing list 
but got no response for:

Today I noticed a strange behaviour of T4's EventListeners. I wanted an 
Any component which renders as a button to submit a form and call my 
listener method after form submission. The docs say that's what the 
EventListener's submitForm parameter is for. So I went about and wrote 
an EventListener, targeted it at my Any component, made it listen to the 
onclick event and set submitForm to my form (page class and HTML 
template below). When I tested my work nothing at all happened. I then 
checked the generated HTML and found that Tapestry did not generate any 
event connection code. When I removed the submitForm parameter it 
suddenly did and my listener method got called the way it's supposed to.

I dived into T4's sources and found out the following:

In ComponentEventConnectionWorker Tapestry stores a list of event 
connections to form components which are not rendered yet and renders 
those when the corresponding form component gets rendered. It stores 
those connections in a Map and uses the form's _id_ as a key (in 
filterFormEvents on line 412). It then checks all components whether 
they got deferred connections to be set up by querying the map using the 
component's _extended id_ and therefore never finds any deferred 
connections for any component. I changed isDeferredForm, 
linkDeferredForm and mapFormNames to use the form's id and suddenly 
Tapestry generates the connection setup javascript code and my form's 
submit listener gets called.

But my listener methods which I annotated with the EventListener 
annotation still don't get called.

Am I doing something wrong or is this a bug in Tapestry for which I 
should file an issue?

Uli

page class:

public abstract class TestPage extends BasePage
{
     public abstract boolean getChecked();

     @EventListener(targets="submitFormAsync", events="onclick", 
submitForm="myForm", async=true)
     public void submitFormAsync() {
         System.out.println("EventListener called from submitFormAsync");
     }

     @EventListener(targets="submitForm", events="onclick", 
submitForm="myForm")
     public void submitForm() {
         System.out.println("EventListener called from submitForm");
     }

     @EventListener(targets="callListenerAsync", events="onclick", 
async=true)
     public void callListenerAsync() {
         System.out.println("EventListener called from callListenerAsync");
     }

     public void formListener()
     {
         System.out.println("Form's listener got called");
         System.out.println("checked: " + getChecked());
     }
}

page template:

<html jwcid="@Shell" title="Test Page"
   xmlns='http://www.w3.org/1999/xhtml'
   doctype='html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" 
\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"'
   debugEnabled="true"
   browserLogLevel="DEBUG"
   consoleEnabled="true">
<head>
<title>Test Page</title>
<body jwcid="@Body">
<form jwcid="myForm@Form" listener="listener:formListener">
<input jwcid="@Checkbox" value="ognl:checked" /><br />

</form>
<p><input jwcid="submitForm@Any" type="button" value="literal:submit 
form via EventListener" /></p>
<p><input jwcid="submitFormAsync@Any" type="button" 
value="literal:submit form async via EventListener" /></p>
<p><input jwcid="callListenerAsync@Any" type="button" 
value="literal:call an EventListener async without submitting the Form" 
/></p>
</body>
</html>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org


Re: T4 EventListeners and formSubmit

Posted by Marcus Schulte <et...@googlemail.com>.
looks like a bug to me, please file a jira issue if it persists.

On 18/04/2008, Ulrich Stärk <ul...@spielviel.de> wrote:
> Indeed, there is an open head tag, that must have been left over from some
> copy-paste-episode. As for the "input" items outside of the form scope:
> those are Any components which render as buttons and don't have to be
> contained inside a form element. I'll give removing the head tag a try
> tomorrow, thanks for the pointer.
>
>  Uli
>
>  cturner schrieb:
>
>
> > Hello. Your HTML looks a bit strange - you're opening a 'head' tag but not
> > closing it before the body opens. Also you have input items that are
> > appearing outside of the form scope. Sort out your HTML template and try
> > again - I'd be interested to know how you go.
> >
> >
> >
> > Ulrich Stärk wrote:
> >
> > > I'd like to bring up an issue I already posted to the user mailing list
> but got no response for:
> > >
> > > Today I noticed a strange behaviour of T4's EventListeners. I wanted an
> Any component which renders as a button to submit a form and call my
> listener method after form submission. The docs say that's what the
> EventListener's submitForm parameter is for. So I went about and wrote an
> EventListener, targeted it at my Any component, made it listen to the
> onclick event and set submitForm to my form (page class and HTML template
> below). When I tested my work nothing at all happened. I then checked the
> generated HTML and found that Tapestry did not generate any event connection
> code. When I removed the submitForm parameter it suddenly did and my
> listener method got called the way it's supposed to.
> > >
> > > I dived into T4's sources and found out the following:
> > >
> > > In ComponentEventConnectionWorker Tapestry stores a list of event
> connections to form components which are not rendered yet and renders those
> when the corresponding form component gets rendered. It stores those
> connections in a Map and uses the form's _id_ as a key (in filterFormEvents
> on line 412). It then checks all components whether they got deferred
> connections to be set up by querying the map using the component's _extended
> id_ and therefore never finds any deferred connections for any component. I
> changed isDeferredForm, linkDeferredForm and mapFormNames to use the form's
> id and suddenly Tapestry generates the connection setup javascript code and
> my form's submit listener gets called.
> > >
> > > But my listener methods which I annotated with the EventListener
> annotation still don't get called.
> > >
> > > Am I doing something wrong or is this a bug in Tapestry for which I
> should file an issue?
> > >
> > > Uli
> > >
> > > page class:
> > >
> > > public abstract class TestPage extends BasePage
> > > {
> > >     public abstract boolean getChecked();
> > >
> > >     @EventListener(targets="submitFormAsync",
> events="onclick", submitForm="myForm", async=true)
> > >     public void submitFormAsync() {
> > >         System.out.println("EventListener called from
> submitFormAsync");
> > >     }
> > >
> > >     @EventListener(targets="submitForm",
> events="onclick", submitForm="myForm")
> > >     public void submitForm() {
> > >         System.out.println("EventListener called from
> submitForm");
> > >     }
> > >
> > >     @EventListener(targets="callListenerAsync",
> events="onclick", async=true)
> > >     public void callListenerAsync() {
> > >         System.out.println("EventListener called from
> > > callListenerAsync");
> > >     }
> > >
> > >     public void formListener()
> > >     {
> > >         System.out.println("Form's listener got called");
> > >         System.out.println("checked: " + getChecked());
> > >     }
> > > }
> > >
> > > page template:
> > >
> > > <html jwcid="@Shell" title="Test Page"
> > >   xmlns='http://www.w3.org/1999/xhtml'
> > >   doctype='html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"
> \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"'
> > >   debugEnabled="true"
> > >   browserLogLevel="DEBUG"
> > >   consoleEnabled="true">
> > > <head>
> > > <title>Test Page</title>
> > > <body jwcid="@Body">
> > > <form jwcid="myForm@Form"
> listener="listener:formListener">
> > > <input jwcid="@Checkbox" value="ognl:checked" /><br />
> > >
> > > </form>
> > > <p><input jwcid="submitForm@Any" type="button" value="literal:submit
> form via EventListener" /></p>
> > > <p><input jwcid="submitFormAsync@Any" type="button"
> value="literal:submit form async via EventListener" /></p>
> > > <p><input jwcid="callListenerAsync@Any" type="button"
> value="literal:call an EventListener async without submitting the Form"
> /></p>
> > > </body>
> > > </html>
> > >
> > >
> ---------------------------------------------------------------------
> > > To unsubscribe, e-mail:
> dev-unsubscribe@tapestry.apache.org
> > > For additional commands, e-mail: dev-help@tapestry.apache.org
> > >
> > >
> > >
> > >
> >
> >
>
>
> ---------------------------------------------------------------------
>  To unsubscribe, e-mail:
> dev-unsubscribe@tapestry.apache.org
>  For additional commands, e-mail: dev-help@tapestry.apache.org
>
>


-- 
Marcus Schulte
http://marcus-schulte.blogspot.com

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org


Re: T4 EventListeners and formSubmit

Posted by Ulrich Stärk <ul...@spielviel.de>.
Indeed, there is an open head tag, that must have been left over from 
some copy-paste-episode. As for the "input" items outside of the form 
scope: those are Any components which render as buttons and don't have 
to be contained inside a form element. I'll give removing the head tag a 
try tomorrow, thanks for the pointer.

Uli

cturner schrieb:
> Hello. Your HTML looks a bit strange - you're opening a 'head' tag but not
> closing it before the body opens. Also you have input items that are
> appearing outside of the form scope. Sort out your HTML template and try
> again - I'd be interested to know how you go.
> 
> 
> 
> Ulrich Stärk wrote:
>> I'd like to bring up an issue I already posted to the user mailing list 
>> but got no response for:
>>
>> Today I noticed a strange behaviour of T4's EventListeners. I wanted an 
>> Any component which renders as a button to submit a form and call my 
>> listener method after form submission. The docs say that's what the 
>> EventListener's submitForm parameter is for. So I went about and wrote 
>> an EventListener, targeted it at my Any component, made it listen to the 
>> onclick event and set submitForm to my form (page class and HTML 
>> template below). When I tested my work nothing at all happened. I then 
>> checked the generated HTML and found that Tapestry did not generate any 
>> event connection code. When I removed the submitForm parameter it 
>> suddenly did and my listener method got called the way it's supposed to.
>>
>> I dived into T4's sources and found out the following:
>>
>> In ComponentEventConnectionWorker Tapestry stores a list of event 
>> connections to form components which are not rendered yet and renders 
>> those when the corresponding form component gets rendered. It stores 
>> those connections in a Map and uses the form's _id_ as a key (in 
>> filterFormEvents on line 412). It then checks all components whether 
>> they got deferred connections to be set up by querying the map using the 
>> component's _extended id_ and therefore never finds any deferred 
>> connections for any component. I changed isDeferredForm, 
>> linkDeferredForm and mapFormNames to use the form's id and suddenly 
>> Tapestry generates the connection setup javascript code and my form's 
>> submit listener gets called.
>>
>> But my listener methods which I annotated with the EventListener 
>> annotation still don't get called.
>>
>> Am I doing something wrong or is this a bug in Tapestry for which I 
>> should file an issue?
>>
>> Uli
>>
>> page class:
>>
>> public abstract class TestPage extends BasePage
>> {
>>      public abstract boolean getChecked();
>>
>>      @EventListener(targets="submitFormAsync", events="onclick", 
>> submitForm="myForm", async=true)
>>      public void submitFormAsync() {
>>          System.out.println("EventListener called from submitFormAsync");
>>      }
>>
>>      @EventListener(targets="submitForm", events="onclick", 
>> submitForm="myForm")
>>      public void submitForm() {
>>          System.out.println("EventListener called from submitForm");
>>      }
>>
>>      @EventListener(targets="callListenerAsync", events="onclick", 
>> async=true)
>>      public void callListenerAsync() {
>>          System.out.println("EventListener called from
>> callListenerAsync");
>>      }
>>
>>      public void formListener()
>>      {
>>          System.out.println("Form's listener got called");
>>          System.out.println("checked: " + getChecked());
>>      }
>> }
>>
>> page template:
>>
>> <html jwcid="@Shell" title="Test Page"
>>    xmlns='http://www.w3.org/1999/xhtml'
>>    doctype='html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" 
>> \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"'
>>    debugEnabled="true"
>>    browserLogLevel="DEBUG"
>>    consoleEnabled="true">
>> <head>
>> <title>Test Page</title>
>> <body jwcid="@Body">
>> <form jwcid="myForm@Form" listener="listener:formListener">
>> <input jwcid="@Checkbox" value="ognl:checked" /><br />
>>
>> </form>
>> <p><input jwcid="submitForm@Any" type="button" value="literal:submit 
>> form via EventListener" /></p>
>> <p><input jwcid="submitFormAsync@Any" type="button" 
>> value="literal:submit form async via EventListener" /></p>
>> <p><input jwcid="callListenerAsync@Any" type="button" 
>> value="literal:call an EventListener async without submitting the Form" 
>> /></p>
>> </body>
>> </html>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: dev-help@tapestry.apache.org
>>
>>
>>
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org


Re: T4 EventListeners and formSubmit

Posted by cturner <cr...@logicscope.com>.
Hello. Your HTML looks a bit strange - you're opening a 'head' tag but not
closing it before the body opens. Also you have input items that are
appearing outside of the form scope. Sort out your HTML template and try
again - I'd be interested to know how you go.



Ulrich Stärk wrote:
> 
> I'd like to bring up an issue I already posted to the user mailing list 
> but got no response for:
> 
> Today I noticed a strange behaviour of T4's EventListeners. I wanted an 
> Any component which renders as a button to submit a form and call my 
> listener method after form submission. The docs say that's what the 
> EventListener's submitForm parameter is for. So I went about and wrote 
> an EventListener, targeted it at my Any component, made it listen to the 
> onclick event and set submitForm to my form (page class and HTML 
> template below). When I tested my work nothing at all happened. I then 
> checked the generated HTML and found that Tapestry did not generate any 
> event connection code. When I removed the submitForm parameter it 
> suddenly did and my listener method got called the way it's supposed to.
> 
> I dived into T4's sources and found out the following:
> 
> In ComponentEventConnectionWorker Tapestry stores a list of event 
> connections to form components which are not rendered yet and renders 
> those when the corresponding form component gets rendered. It stores 
> those connections in a Map and uses the form's _id_ as a key (in 
> filterFormEvents on line 412). It then checks all components whether 
> they got deferred connections to be set up by querying the map using the 
> component's _extended id_ and therefore never finds any deferred 
> connections for any component. I changed isDeferredForm, 
> linkDeferredForm and mapFormNames to use the form's id and suddenly 
> Tapestry generates the connection setup javascript code and my form's 
> submit listener gets called.
> 
> But my listener methods which I annotated with the EventListener 
> annotation still don't get called.
> 
> Am I doing something wrong or is this a bug in Tapestry for which I 
> should file an issue?
> 
> Uli
> 
> page class:
> 
> public abstract class TestPage extends BasePage
> {
>      public abstract boolean getChecked();
> 
>      @EventListener(targets="submitFormAsync", events="onclick", 
> submitForm="myForm", async=true)
>      public void submitFormAsync() {
>          System.out.println("EventListener called from submitFormAsync");
>      }
> 
>      @EventListener(targets="submitForm", events="onclick", 
> submitForm="myForm")
>      public void submitForm() {
>          System.out.println("EventListener called from submitForm");
>      }
> 
>      @EventListener(targets="callListenerAsync", events="onclick", 
> async=true)
>      public void callListenerAsync() {
>          System.out.println("EventListener called from
> callListenerAsync");
>      }
> 
>      public void formListener()
>      {
>          System.out.println("Form's listener got called");
>          System.out.println("checked: " + getChecked());
>      }
> }
> 
> page template:
> 
> <html jwcid="@Shell" title="Test Page"
>    xmlns='http://www.w3.org/1999/xhtml'
>    doctype='html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" 
> \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"'
>    debugEnabled="true"
>    browserLogLevel="DEBUG"
>    consoleEnabled="true">
> <head>
> <title>Test Page</title>
> <body jwcid="@Body">
> <form jwcid="myForm@Form" listener="listener:formListener">
> <input jwcid="@Checkbox" value="ognl:checked" /><br />
> 
> </form>
> <p><input jwcid="submitForm@Any" type="button" value="literal:submit 
> form via EventListener" /></p>
> <p><input jwcid="submitFormAsync@Any" type="button" 
> value="literal:submit form async via EventListener" /></p>
> <p><input jwcid="callListenerAsync@Any" type="button" 
> value="literal:call an EventListener async without submitting the Form" 
> /></p>
> </body>
> </html>
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: dev-help@tapestry.apache.org
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/T4-EventListeners-and-formSubmit-tp15700830p16750982.html
Sent from the Tapestry - Dev mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org