Hi Matthias,
as second parameter of deferredZoneUpdate() function You need to
provide a event link to a function that returns a block or a
Zone.Body, something like:

    @OnEvent("update-zone-event")
    Object myEvent() {
       return request.isXHR()?zone.getBody():null;
    }

the event Link, that should be passed to js Module can be created as follow:

public String getZoneUpdateLink() {
     componentResources.createEventLink("update-zone-event",
context).toAbsoluteURI();
}

JavaScript, something like
require([ "jquery", "t5/core/zone" ], function($, zoneManager) {
    var moduleFunc, exports;
    moduleFunc = function(myController, myZoneId, url){
        $('#'+myControllerId).on("myEvent", function(e) {
            zoneManager.deferredZoneUpdate(myZoneId, url);
        }
    };
    return exports = {
        moduleFunc: moduleFunc
    };
});
}).call(this);

and initialization call in page/component:

javaScriptSupport.require("myModule").invoke("moduleFunc").with(myControllerId,
zone.getClientId(), getZoneUpdateLink());


2013/12/12 Matthias <thegreatme...@gmail.com>:
> Thanks to both of you, I tried Howard's approach but I think I missing
> something fundamental.
> Heres my new code:
>
> JavaScript
> require([ "jquery", "t5/core/zone" ], function($, zoneManager) {
>
>     // #1 with zone.update
>     var myZone = $("#myZone");
>     // why do I have to set the data-update-zone attribute?
>     myZone.attr("data-update-zone", "myZone");
>     var zone = zoneManager.findZone(myZone);
>     // this works, but just with a string. should I get the dom elements via
> ajax?
>     zone.update("some string");
>
>     // #2 refresh - there is no refresh method on the zone?
>     // zone.refresh();
>
>     // #3 defferedZoneUpdate
>     // the java method is called - maybe this can work
>     zoneManager.deferredZoneUpdate("myZone",
> "http://localhost:8080/search.myZone";);
> });
>
> Java
> public class Search {
>
>     // the method is called successfully, but my zone is not updated in any
> way.
>     JSONArray onActionFromDriverZone() {
>         JSONArray arr = new JSONArray();
>         JSONObject d = new JSONObject();
>         d.put("id", "2");
>         arr.put(d);
>         return arr;
>
>     }
> }
>
>
> On 12.12.2013 12:56, Howard Lewis Ship wrote:
>>
>> 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
>>>>
>>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to