The short form is: trigger an events.zone.update event on the zone's client-side element to update it immediately, using available content (a string, or DOM elements).
Or, trigger events.zone.refresh event when you know a URL and additional parameters; Tapestry will run the Ajax request and update the zone when the content is available. I think Geoff's example is actually a bit complicated. Take a peek at the t5/core/zone module to see how simple it can be: http://people.apache.org/~hlship/t5api/coffeescript/zone.html On Thu, Dec 12, 2013 at 1:47 AM, Geoff Callender < geoff.callender.jumpst...@gmail.com> wrote: > This should give you the clues you need: it's the ZoneUpdater mixin from > the upcoming preview of JumpStart 7. It uses a dependency on "t5/core/zone". > > Example usage: > > <t:textfield t:id="firstName" t:mixins="zoneUpdater" clientEvent="keyup" > event="firstNameChanged" zone="nameZone"/> > > > ZoneUpdater.java: > > /** > * A simple mixin for attaching javascript that updates a zone on any > client-side event. > * Based on > http://tinybits.blogspot.com/2010/03/new-and-better-zoneupdater.html > */ > package jumpstart.web.mixins; > > import org.apache.tapestry5.BindingConstants; > import org.apache.tapestry5.ClientElement; > import org.apache.tapestry5.ComponentResources; > import org.apache.tapestry5.annotations.Environmental; > import org.apache.tapestry5.annotations.InjectContainer; > import org.apache.tapestry5.annotations.Parameter; > import org.apache.tapestry5.ioc.annotations.Inject; > import org.apache.tapestry5.services.javascript.JavaScriptSupport; > > public class ZoneUpdater { > > // Parameters > > /** > * The event to listen for on the client. If not specified, zone > update can only be triggered manually through > * calling updateZone on the JS object. > */ > @Parameter(name = "clientEvent", defaultPrefix = > BindingConstants.LITERAL) > private String clientEvent; > > /** > * The event to listen for in your component class > */ > @Parameter(name = "event", defaultPrefix = > BindingConstants.LITERAL, required = true) > private String event; > > @Parameter(name = "prefix", defaultPrefix = > BindingConstants.LITERAL, value = "default") > private String prefix; > > @Parameter(name = "context") > private Object[] context; > > /** > * The zone to be updated by us. > */ > @Parameter(name = "zone", defaultPrefix = > BindingConstants.LITERAL, required = true) > private String zone; > > /** > * Set secure to true if https is being used, else set to false. > */ > @Parameter(name = "secure", defaultPrefix = > BindingConstants.LITERAL, value = "false") > private boolean secure; > > // Useful bits and pieces > > @Inject > private ComponentResources componentResources; > > @Environmental > private JavaScriptSupport javaScriptSupport; > > /** > * The element we attach ourselves to > */ > @InjectContainer > private ClientElement clientElement; > > // The code > > void afterRender() { > String listenerURI = > componentResources.createEventLink(event, context).toAbsoluteURI(secure); > > > javaScriptSupport.require("mixins/zone-updater").with(clientElement.getClientId(), > clientEvent, listenerURI, > zone); > } > } > > > zone-updater.js: > > define(["jquery", "t5/core/zone"], function($, zoneManager) { > > return function(elementId, clientEvent, listenerURI, > zoneElementId) { > var element = $("#" + elementId); > > if (clientEvent) { > element.on(clientEvent, updateZone); > } > > function updateZone() { > var listenerURIWithValue = listenerURI; > > if (element.val()) { > listenerURIWithValue = > appendQueryStringParameter(listenerURIWithValue, 'param', element.val()); > } > > zoneManager.deferredZoneUpdate(zoneElementId, > listenerURIWithValue); > } > } > > function appendQueryStringParameter(url, name, value) { > if (url.indexOf('?') < 0) { > url += '?' > } > else { > url += '&'; > } > value = escape(value); > url += name + '=' + value; > return url; > } > > }); > > Cheers, > > Geoff > > > On 12/12/2013, at 6:50 AM, Matthias wrote: > > > Hi, > > > > I'd like to update a zone with a simple ajax call and I'm not sure how > its done: > > > > Javascript > > require([ "jquery", "myController"], function($, myController) { > > > > $(myController).on("myEvent", function(e) { > > // here i'd like to fire an ajax call that should update my zone > > }); > > }); > > > > tml > > <t:zone id="myZone" t:id="myZone"> > > <table class="table"> > > <tbody> > > <tr t:type="loop" source="hits" value="hit"> > > <td>${hit.id}</td> > > </tr> > > </tbody> > > </table> > > </t:zone> > > > > Java > > public class Search { > > > > @Property > > // some other annotations needed? > > List<Hit> hits; > > > > @Property > > // some other annotations needed? > > Hit hit; // i need this right? > > > > @InjectComponent > > private Zone myZone; > > > > private void setupRender() { > > hits = new ArrayList<>(); > > } > > > > Object onAjaxEvent() { > > hits = // do some solr stuff to get hits > > return myZone; > > } > > } > > > > In 5.3 there was a Tapestry javascript object with a > findZoneManagerForZone() method. How is this done in 5.4? > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > > For additional commands, e-mail: users-h...@tapestry.apache.org > > > > -- Howard M. Lewis Ship Creator of Apache Tapestry The source for Tapestry training, mentoring and support. Contact me to learn how I can get you up and productive in Tapestry fast! (971) 678-5210 http://howardlewisship.com