Recently I integrated Select2 component to my tapestry5 application.
Select2 can load data from server using ajax when user scrolls through drop down.
There could be any data formats in ajax response provided that developer implements javascript
results()
function that parses the response into the format expected by select2.
Select2 provides two more callback functions that developers usually implement to post-process returned data:
id()
function that retrieves id from the choice object;formatResult()
function that builds HTML markup which is used to display choice object in drop down.
I used Tynamo's tapestry-resteasy to build REST service that returns data to select2, and my REST service returned everything needed to implement
id()
and formatResult()
functions.
I could just implement
To do that I built tapestry5 service that does just this –
formatResult()
to build HTML markup for select2, but I already had similar tapestry5 component that builds the same markup and I wanted to increase code reuse.To do that I built tapestry5 service that does just this –
EventResponseRenderer
(see code below).To use it:
- Declare a block you want to render, as you usually do. In my example I created separate page –
internal/CompanyBlocks.tml
– and there is myaddressBlock
; - Declare event handler method that handles "Render" event and returns the block you want to render (note that you may also use tapestry5
AjaxResponseRenderer.addRender()
); - In my example this is:
public Block onRenderFromCompanyAddress(Company company)
- Note that you must specify id of tapestry5 component in event handler method name. This is the limitation of my EventResponseRenderer implementation and only required to conform tapestry5 API. This could be id of any component from the page;
- You will probably want to declare some parameters that you will use to initialize page properties required for block renderer. You don't have to implement type coercers for them, because you will pass values for these parameters from code;
@Inject
instance ofEventResponseRenderer
and call itsrender()
method passing instance ofRenderEvent
to it.RenderEvent
constructor acceptspageName
where event handler method declared,componentId
that was used in event handler method name (see previous step), andeventArgs
– list of objects that will be passed as parameters to the event handler method. See methodCompanyResourceImpl.createMatch()
- Thats it.