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
> 

Reply via email to