It is subtle and powerful, and you missed one minor detail. On Mon, Nov 3, 2008 at 1:57 PM, Robert Zeigler <[EMAIL PROTECTED]> wrote:
> As a follow-up: > > Tutorials show this binding done >>> through the @OnEvent annotation and specifying the event name via the >>> "component" attribute in the annotation or the "id" attribute of the >>> element. >>> >> > This is not quite correct. > The component attribute of the @OnEvent annotation identifies which > /component/ generates the event, but not which event is generated. > It's the "value" attribute that specifies which event to listen to: > > .tml: > <t:eventlink t:id="mycomp" event="myevent">Click Me</t:eventlink> > > .java: > @OnEvent(value="myevent",component="mycomp") > void someHandler() { > } This will not be called because EventLink triggers the provided event not on itself, but on its container. Omit the component attribute for this to work as written. > > > Or, if you prefer convention-over-configuration: > .java: > void onMyeventFromMycomp() { > ... > } > > Or even: > void onMyevent() { > ... > } > This will work because it intercepts the event notification fired on the page (the container of the EventLink instance). I've been asked which to use: EventLink or ActionLink. I think, possibly, if I had created EventLink first, I would not have created ActionLink. That being said, ActionLink is useful when you have many one-off components with individual logic on each ... it's easier since you specify (in the template) a unique component id, which you would do anyway. You just have to match that id against an event handler method name. EventLink is when you have multiple components in the template that should trigger the same behavior. You can usually omit the component id, but you have to carefully coordinate the event name in the template and in the Java class (either inside the @OnEvent annotation, or as part of the event handler method name). > > HTH, > > Robert > > > On Nov 3, 2008, at 11/31:07 PM , Robert Zeigler wrote: > > Hi Marcel, >> >> The binding of the listener to the event is done automatically by tapestry >> based either on the @OnEvent annotation or by naming convention. >> >> The context argument is simply used to allow for additional information to >> be encoded into the url which will be provided to the handler in the form of >> method parameters. >> For example: >> >> .html: >> <a href="${myLink}">My Link</a> >> >> .java: >> @Inject >> private ComponentResources resources; >> public Link getMyLink() { >> return resources.createEventLink("myevent","value1"); >> } >> >> @Inject >> private ComponentSource componentSource; >> >> Object onMyevent(String name) { >> //do something interesting. Here, we look up a page based on the page >> name provided in name. >> return componentSource.getPage(name); >> } >> >> >> And that's it. Now when you click "MyLink", the "onMyevent" method will >> be called, passing in "value1" as the value of the "name" parameter. >> >> * The values in context will be converted to and from strings via the >> ValueEncoder service & contributions. >> * Events always bubble in T5, so your handler has to be either at the >> level of the component which has the link, or in a class that wraps that >> component. That is, suppose the following page structure: >> >> page x >> - component a >> - event link, event is "foo". >> - event link, event is "bar". >> >> The handler for the "foo" event must be in either component a or in page >> x. The handler for "bar" must be in page x. A handler for the "bar" event >> in component a won't be called by clicking the event link of page x. >> >> HTH, >> >> Robert >> >> >> On Nov 3, 2008, at 11/312:05 PM , Marcel Sammut wrote: >> >> >>> I'm aware of the large gap between 3 and 5 and may require some redesign >>> on >>> my part. That is why I'm using native tapestry links. In 5.0.15, the >>> ComponentResources class has the createActionLink deprecated in favor of >>> createEventLink. There are only 2 difference between ActionLink and >>> EventLink according to the API, the way it is controlled and the way it >>> is >>> triggered. >>> >>> I do want to use an EventLink in my situation, and do this through >>> ComponentResources.createEventLink(). The tutorials show you how to use >>> the >>> ActionLink in a template, whereas in my case, the component is created >>> via >>> Java code. Perhaps I do not understand what the "context" argument in >>> the >>> createEventLink() method is used for. I believe that the first argument >>> would be the name of the method to invoke? How do you identify the >>> handler >>> of the event when creating the EventLink? Tutorials show this binding >>> done >>> through the @OnEvent annotation and specifying the event name via the >>> "component" attribute in the annotation or the "id" attribute of the >>> element. >>> >>> How would I bind these properties using a pure Java implementation? My >>> previous T3 components never had a template file, and rendered purly in >>> Java. >>> >>> Thanks >>> - Marcel >>> >>> >>> >>> Peter Stavrinides wrote: >>> >>>> >>>> Hi Marcel >>>> >>>> Tapestry 5 is not like 3, most of the boilerplate code is gone, it >>>> appears >>>> to me that you are trying to do too much... have you gone through the >>>> tutorials yet? I think you will be pleasantly surprised how simple yet >>>> powerful T5 is. You also haven't quite grasped the difference between >>>> ActionLink and EventLink and PageLink (it sounds like you want an >>>> EventLink) >>>> >>>> cheers >>>> Peter >>>> >>>> Thanks! >>>> I seem to be able to render the anchor component based on the Link being >>>> created from the ComponentResources.createActionLink(). However, the >>>> action >>>> does not seem to be fired when I hook up the event using the @OnEvent >>>> annotation. The anchor is rendered using the MarkupWriter.element() >>>> method >>>> using the Link object to define the href attribute. >>>> >>>> Note, that the creating and rendering of the action anchor is done >>>> purely >>>> in >>>> Java...no template. >>>> >>>> My anchor renders the following url: >>>> mypage.pagelayout/activate Activate >>>> >>>> There is a page called Home/MyPage and on this page is a component >>>> called >>>> PageLayout which is an extension of my Layout component. In the >>>> PageLayout >>>> component, I have my "activate" event handler as follows: >>>> @OnEvent(component="activate") >>>> public Object activate() { >>>> ... >>>> } >>>> >>>> Any idea why the activate event is not being called and how I can hook >>>> the >>>> event to the action? >>>> >>>> Thanks Once Again. >>>> Marcel >>>> >>>> >>>> Howard Lewis Ship wrote: >>>> >>>>> >>>>> ${createURL} click me >>>>> >>>>> You just have to provide getCreateURL() as a wrapper around >>>>> ComponentResources.createActionLink(). >>>>> >>>>> You don't instantiate a component, just @Inject the ComponentResources. >>>>> >>>>> On Fri, Oct 31, 2008 at 5:24 PM, Marcel Sammut <[EMAIL PROTECTED]> >>>>> wrote: >>>>> >>>>>> >>>>>> Thanks for the quick response. My delima is that I need to have a >>>>>> reference >>>>>> to the link in the .tml template. I was hoping to just use a pure >>>>>> Java >>>>>> implementation to let the developer configure the menu via code. >>>>>> In order to do this, I believe I have to inject the ComponentResources >>>>>> object of my container when instantiating the AbstractLink component. >>>>>> Any >>>>>> idea to do that? >>>>>> >>>>>> Thanks, >>>>>> Marcel >>>>>> >>>>>> >>>>>> Robert Zeigler wrote: >>>>>> >>>>>>> >>>>>>> Why not just use ComponentResources.createActionLink and >>>>>>> ComponentResources.createPageLink? >>>>>>> >>>>>>> .tml: >>>>>>> $somelink Link Text >>>>>>> .java: >>>>>>> >>>>>>> @Inject >>>>>>> private ComponentResources resources; >>>>>>> >>>>>>> public String getSomeLink() { >>>>>>> return >>>>>>> >>>>>>> resources.createPageLink("mypage",true,contextValue1,contextValue2,...); >>>>>>> } >>>>>>> >>>>>>> >>>>>>> Robert >>>>>>> >>>>>>> On Oct 31, 2008, at 10/315:04 PM , Marcel Sammut wrote: >>>>>>> >>>>>>> >>>>>>>> Greetings, >>>>>>>> I'm looking at porting my 3.0 tapestry web application to v5 and I'm >>>>>>>> trying >>>>>>>> to build a menu component which accepts a parameter of type >>>>>>>> ArrayList that >>>>>>>> contains a list of AbstractLink objects. These items get rendered >>>>>>>> in a menu >>>>>>>> layout etc. The page that this menu component exists on will >>>>>>>> create, at >>>>>>>> runtime, the set of desired menu item and pass them to the menu >>>>>>>> component. >>>>>>>> >>>>>>>> This sounds straight forward, however, I am unable to determin how >>>>>>>> to >>>>>>>> instantiate, for example, a new instance of a ActionLink. In the >>>>>>>> previous >>>>>>>> version (3.0), I simply rendered the anchor myself and generated the >>>>>>>> URi in >>>>>>>> a custom implementation. I was hoping that in T5, I would be able >>>>>>>> to use >>>>>>>> the internal Link components since they do pretty much what I was >>>>>>>> doing in >>>>>>>> 3.0. >>>>>>>> >>>>>>>> Is there a way, in code, to create a new ActionLink component and >>>>>>>> have it >>>>>>>> act as the model for another component to be rendered? >>>>>>>> >>>>>>>> Your thoughts are much appreciated. >>>>>>>> - Marcel >>>>>>>> -- >>>>>>>> View this message in context: >>>>>>>> >>>>>>>> http://www.nabble.com/-T5--Creating-Links-At-Runtime-tp20274715p20274715.html >>>>>>>> Sent from the Tapestry - User mailing list archive at Nabble.com. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>>>>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>>>>>> >>>>>>> >>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>>>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> -- >>>>>> View this message in context: >>>>>> >>>>>> http://www.nabble.com/-T5--Creating-Links-At-Runtime-tp20274715p20275943.html >>>>>> Sent from the Tapestry - User mailing list archive at Nabble.com. >>>>>> >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Howard M. Lewis Ship >>>>> >>>>> Creator Apache Tapestry and Apache HiveMind >>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>>> >>>>> >>>>> >>>>> >>>> -- >>>> View this message in context: >>>> >>>> http://www.nabble.com/-T5--Creating-Links-At-Runtime-tp20274715p20286038.html >>>> Sent from the Tapestry - User mailing list archive at Nabble.com. >>>> >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>> >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>> >>>> >>>> >>>> >>> -- >>> View this message in context: >>> http://www.nabble.com/-T5--Creating-Links-At-Runtime-tp20274715p20307367.html >>> Sent from the Tapestry - User mailing list archive at Nabble.com. >>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>> For additional commands, e-mail: [EMAIL PROTECTED] >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- Howard M. Lewis Ship Creator Apache Tapestry and Apache HiveMind