See if this running example helps.

        
http://jumpstart.doublenegative.com.au/jumpstart/examples/ajax/periodicupdate

Cheers,

Geoff

On 04/06/2012, at 3:30 PM, sommeralex wrote:

> Hi Arno,
> 
> Thx for your help again!
> 
> The javascript function is drawGroups is called and my alert('ok') appears,
> but
> 
> If i am returning zone.getBody(), then i am still getting this response:
> 
> Ajax failure: Status 500 for /group/listlocalgroups:getgroupsonlocation:
> org.apache.tapestry5.ioc.internal.OperationException
> Communication with the server failed:
> org.apache.tapestry5.ioc.internal.OperationException
> 
> CODE:
> 
> package com.airwriting.frontend.pages.group;
> 
> import java.util.List;
> 
> 
> import org.apache.tapestry5.ComponentResources;
> import org.apache.tapestry5.Link;
> import org.apache.tapestry5.annotations.Import;
> import org.apache.tapestry5.annotations.InjectComponent;
> import org.apache.tapestry5.annotations.Property;
> import org.apache.tapestry5.corelib.components.Zone;
> import org.apache.tapestry5.ioc.annotations.Inject;
> import org.apache.tapestry5.json.JSONArray;
> import org.apache.tapestry5.json.JSONObject;
> import org.apache.tapestry5.services.Request;
> import org.apache.tapestry5.services.javascript.JavaScriptSupport;
> 
> import com.airwriting.domain.GeoPoint;
> import com.airwriting.domain.Group;
> import com.airwriting.service.GeometryService;
> import com.airwriting.service.data.GroupService;
> import com.vividsolutions.jts.geom.Geometry;
> 
> @Import(library = {
>        "context:js/browselocalgroups.js"
>    })
> public class ListLocalGroups {
> 
>    @Inject
>    private GroupService groupService;
>    @Inject
>    private JavaScriptSupport jsSupport;
>    @Inject
>    private Request request;
>    @Inject
>    private ComponentResources componentResources;
>    @Property
>    private Geometry location;
> 
>    @Property
>    private List<Group> groups;
> 
>    @InjectComponent
>    private Zone zone;
> 
>    @SuppressWarnings("unused")
>    @Property
>    private Group curGroup;
> 
>    public void setupRender() {
>        Link linkGetGroupsOnLocation =
> componentResources.createEventLink("getGroupsOnLocation");
> 
> 
>        jsSupport.addScript(
>                "init('%s');",
>                linkGetGroupsOnLocation.toURI());
>    }
> 
>    public Object  onGetGroupsOnLocation(){
>        Double lat = Double.parseDouble( request.getParameter("lat") );
>        Double lng = Double.parseDouble( request.getParameter("lng") );
>        Double radiusInMeters = Double.parseDouble(
> request.getParameter("radius") ) / 2;
> 
>        Geometry location = GeometryService.getPolygon(new GeoPoint(lat,
> lng), radiusInMeters.intValue());
>        groups = groupService.getGroupsOnLocation(location);
>        return zone.getBody();
>    }
> 
> }
> 
> 
> TML
> 
> <t:layout xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd";>
> 
>    <div class ="map" id="map"></div>
>    <t:googleMaps />
> 
> 
> <t:zone t:id="zone" id="zone">
>    <div id="zoneDiv">
> 
>    <t:loop source="groups" value="curGroup">
> 
>        <div style="float:left">
>            ${curGroup.name}
>        </div>
>    </t:loop>
> 
>    </div>
> </t:zone>
> </t:layout>
> 
> JAVASCRIPT
> 
> var urlGetGroupsOnLocation;
> var geocoder;
> 
> 
> function init(url){
>    urlGetGroupsOnLocation = url;
> 
>    geocoder = new GClientGeocoder();
> 
>    if (navigator.geolocation) {
>        navigator.geolocation.getCurrentPosition(
>            function(position){
>                updateLocation(position.coords.latitude,
> position.coords.longitude);
>            },
>            function(msg){
>                // error case: nothing todo because we have already
> initialized the map
>            }
>        );
>    }else {
>        alert("no location");
>    }
> 
> }
> 
> function updateLocation(lat, lng){
>    onGetLatLng(new GLatLng(lat,lng));
> }
> 
> function onGetLatLng(gLatLng){
> 
>    if(gLatLng == null) {
>        alert("Sorry, we couldn't find this address.");
>        return false;
>    }
>     alert ("ajax");
>    new Ajax.Request(urlGetGroupsOnLocation, { onSuccess: drawGroups,
>        parameters: 'lat='+gLatLng.lat() + '&lng=' + gLatLng.lng() +
> '&radius=' + 50000});
> }
> 
> function drawGroups(response){
>     alert ("draw");
>    var groupArray = response.responseJSON;
>    var list = "<ol>";
>    for (var i = 0; i < groupArray .length; i++) {
>        var group = groupArray [i];
> 
>       // var link = "<t:pagelink page=\"group/show\" context=\"" +
> group['id'] + "\">link</t:pagelink>"
> 
>        var link = "<a t:type=\"pagelink\" href=\"show/" + + group['id']
> +   "\" t:page=\"group/show\" t:context=" + group['id'] + ">"+
> group['name'] +"</a>";
> 
> 
> 
>            list +="<li>"+link +"</li>";
> 
> 
>        // If property names are known beforehand, you can also just do e.g.
>        // alert(object.id + ',' + object.Title);
>    }
> 
> 
> 
>     //list +="</ol>";
>     //document.getElementById("list").innerHTML=list;
>     alert ("zone");
>     var zoneObject=Tapestry.findZoneManagerForZone('zone');
>     zoneObject.updateFromURL(urlGetGroupsOnLocation, {});
>     alert ("ok");
> }
> 
> 
> 
> 
> 
> 2012/6/3 Arno Haase [via Tapestry] <
> ml-node+s1045711n5713595...@n5.nabble.com>
> 
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>> 
>>> 1. What is the difference between a zone and a block?! The docs are
>>> (in my opinion not clear)
>> 
>> A Zone is basically an HTML <div> with support for replacing its
>> children via AJAX. It is a Tapestry component, and it is actually
>> rendered in the browser.
>> 
>> A Block on the other hand is something like a named repository for
>> stuff that can be partially rendered. It is not a Tapestry component,
>> and it does not generate HTML when its parent in the .tml file is
>> rendered. Its purpose is to provide a handle to a chunk of code - one
>> prominent example being an AJAX update of a Zone.
>> 
>>> 2. What do I need to update a specific element as shown in my
>>> example? My Javascript is updating the java-method, and within the
>>> java method I want to force a partial update of my TML.
>> 
>> The way that Tapestry supports this best is to wrap the to-be-updated
>> element in a <t:Zone>, call an event handler (e.g. via the JS I sent
>> you) and have the event handler return a block.
>> 
>> You can return an arbitrary block, which causes Tapestry to replace
>> the children of the <div> element corresponding to the Zone with
>> arbitrary code. For the simple case that you just want to re-render
>> the same markup, you can @InjectComponent the zone and return
>> zone.getBody():
>> 
>> 
>> <t:Zone t:id="myZone">
>>  ...
>> </t:Zone>
>> 
>> 
>> @InjectComponent Zone myZone;
>> 
>> 
>> ...
>> 
>> public Object onMyEvent() {
>>     ...
>>    return myZone.getBody();
>> }
>> 
>> 
>> Hope this helps
>> 
>> - - Arno
>> 
>> 
>>> 
>>> thx...
>>> 
>>> 2012/6/3 Arno Haase [via Tapestry] <
>>> [hidden email] <http://user/SendEmail.jtp?type=node&node=5713595&i=0>>
>>> 
>>> Been offline the last couple of days.
>>> 
>>> Your event handler returns a JSONArray which is probably not what
>>> you want.
>>> 
>>> You wrote initially that you would like Tapestry to re-render your
>>> zone. The straight-forward way to do that is to put your rendering
>>> code in a <t:block> in your .tml, @Inject that block into your
>>> page class and return that block from your event handler. That
>>> causes Tapestry to render that block, send the resulting DOM part
>>> to the browser and replace the content of the Zone with it.
>>> 
>>> So basically your event handler does not deal with JS / JSON
>>> directly any more but rather delegate the rendering to Tapestry.
>>> 
>>> Hope that helps, otherwise keep asking ;-)
>>> 
>>> - Arno
>>> 
>>> 
>>> 
>>> 
>>> 
>>> Am 31.05.2012 00:44, schrieb sommeralex:
>>> 
>>>>>> Hi Arno,
>>>>>> 
>>>>>> Thx for your your answer. If i am trying what you say, i get
>>>>>> this error message:
>>>>>> 
>>>>>> Ajax failure: Status 500 for
>>>>>> /group/listlocalgroups:getgroupsonlocation:
>>>>>> org.apache.tapestry5.ioc.internal.OperationException
>>>>>> Communication with the server failed:
>>>>>> org.apache.tapestry5.ioc.internal.OperationException
>>>>>> 
>>>>>> FULL CODE:
>>>>>> 
>>>>>> package com.airwriting.frontend.pages.group;
>>>>>> 
>>>>>> import java.util.List;
>>>>>> 
>>>>>> 
>>>>>> import org.apache.tapestry5.ComponentResources; import
>>>>>> org.apache.tapestry5.Link; import
>>>>>> org.apache.tapestry5.annotations.Import; import
>>>>>> org.apache.tapestry5.annotations.InjectComponent; import
>>>>>> org.apache.tapestry5.annotations.Property; import
>>>>>> org.apache.tapestry5.corelib.components.Zone; import
>>>>>> org.apache.tapestry5.ioc.annotations.Inject; import
>>>>>> org.apache.tapestry5.json.JSONArray; import
>>>>>> org.apache.tapestry5.json.JSONObject; import
>>>>>> org.apache.tapestry5.services.Request; import
>>>>>> org.apache.tapestry5.services.javascript.JavaScriptSupport;
>>>>>> 
>>>>>> import com.myProj.domain.GeoPoint; import
>>>>>> com.myProj.domain.Group; import
>>>>>> com.myProj.service.GeometryService; import
>>>>>> com.myProj.service.data.GroupService; import
>>>>>> com.vividsolutions.jts.geom.Geometry;
>>>>>> 
>>>>>> @Import(library = { "context:js/browselocalgroups.js" })
>>>>>> public class ListLocalGroups {  @Inject private GroupService
>>>>>> groupService; @Inject private JavaScriptSupport jsSupport;
>>>>>> @Inject private Request request; @Inject private
>>>>>> ComponentResources componentResources; @Property private
>>>>>> Geometry location; @Property private List<Group> groups;
>>>>>> @InjectComponent private Zone zone;
>>>>>> @SuppressWarnings("unused") @Property private Group curGroup;
>>>>>> public void setupRender() { Link linkGetGroupsOnLocation =
>>>>>> componentResources.createEventLink("getGroupsOnLocation");
>>>>>> 
>>>>>> jsSupport.addScript( "init('%s');",
>>>>>> linkGetGroupsOnLocation.toURI()); }  public JSONArray
>>>>>> onGetGroupsOnLocation(){ Double lat = Double.parseDouble(
>>>>>> request.getParameter("lat") ); Double lng =
>>>>>> Double.parseDouble( request.getParameter("lng") ); Double
>>>>>> radiusInMeters = Double.parseDouble(
>>>>>> request.getParameter("radius") ) / 2;  Geometry location =
>>>>>> GeometryService.getPolygon(new GeoPoint(lat, lng),
>>>>>> radiusInMeters.intValue()); groups =
>>>>>> groupService.getGroupsOnLocation(location); JSONArray
>>>>>> jsGroups = new JSONArray(); for(Group group : groups){
>>>>>> JSONObject jsGroup = group.toJSON(); jsGroup.put("lat",
>>>>>> group.getScope().getCentroid().getY()); jsGroup.put("lng",
>>>>>> group.getScope().getCentroid().getX());
>>>>>> jsGroups.put(jsGroup); } return jsGroups; }  }
>>>>>> 
>>>>>> 
>>>>>> TML
>>>>>> 
>>>>>> <t:layout
>>>>>> xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd";>
>>>>>> 
>>>>>> 
>>>>>> 
>> <div class ="map" id="map"></div> <t:googleMaps />
>> 
>>>>>> 
>>>>>> 
>>>>>> <t:zone t:id="zone" id="zone"> <div id="zoneDiv">  <t:loop
>>>>>> source="groups" value="curGroup">
>>>>>> 
>>>>>> <div style="float:left"> test </div> </t:loop>  </div>
>>>>>> </t:zone> </t:layout>
>>>>>> 
>>>>>> JAVASCRIPT
>>>>>> 
>>>>>> var urlGetGroupsOnLocation; var geocoder;
>>>>>> 
>>>>>> 
>>>>>> function init(url){ urlGetGroupsOnLocation = url;
>>>>>> 
>>>>>> geocoder = new GClientGeocoder();
>>>>>> 
>>>>>> if (navigator.geolocation) {
>>>>>> navigator.geolocation.getCurrentPosition(
>>>>>> function(position){ updateLocation(position.coords.latitude,
>>>>>> position.coords.longitude); }, function(msg){ // error case:
>>>>>> nothing todo because we have already initialized the map } );
>>>>>> }else { alert("no location"); }
>>>>>> 
>>>>>> }
>>>>>> 
>>>>>> function updateLocation(lat, lng){ onGetLatLng(new
>>>>>> GLatLng(lat,lng)); }
>>>>>> 
>>>>>> function onGetLatLng(gLatLng){
>>>>>> 
>>>>>> if(gLatLng == null) { alert("Sorry, we couldn't find this
>>>>>> address."); return false; } alert ("ajax"); new
>>>>>> Ajax.Request(urlGetGroupsOnLocation, { onSuccess:
>>>>>> drawGroups, parameters: 'lat='+gLatLng.lat() + '&lng=' +
>>>>>> gLatLng.lng() + '&radius=' + 50000}); }
>>>>>> 
>>>>>> function drawGroups(response){ alert ("draw"); var groupArray
>>>>>> = response.responseJSON; var list = "<ol>"; for (var i = 0; i
>>>>>> < groupArray .length; i++) { var group = groupArray [i];
>>>>>> 
>>>>>> // var link = "<t:pagelink page=\&quot;group/show\&quot;
>>>>>> context=\&quot;&quot; + group['id'] +
>>>>>> &quot;\&quot;>link</t:pagelink>"  var link = "<a
>>>>>> t:type=\&quot;pagelink\&quot; href=\&quot;show/&quot; + +
>>>>>> group['id'] +   &quot;\&quot;
>>>>>> t:page=\&quot;group/show\&quot; t:context=&quot; +
>>>>>> group['id'] + &quot;>"+ group['name'] +" ";
>>>>>> 
>>>>>> list +="<li>"+link +"</li>";
>>>>>> 
>>>>>> 
>>>>>> // If property names are known beforehand, you can also just
>>>>>> do e.g. // alert(object.id + ',' + object.Title); }
>>>>>> 
>>>>>> //list +="</ol>";
>>>>>> //document.getElementById("list").innerHTML=list; alert
>>>>>> ("zone"); var
>>>>>> zoneObject=Tapestry.findZoneManagerForZone('zone');
>>>>>> zoneObject.updateFromURL(urlGetGroupsOnLocation, {}); alert
>>>>>> ("ok"); }
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> -- View this message in context:
>>>>>> 
>>> 
>> http://tapestry.1045711.n5.nabble.com/javascript-and-tapestry-reloading-a-list-tp5713535p5713545.html
>>>>>> 
>>>>>> 
>>> 
>>> 
>> Sent from the Tapestry - User mailing list archive at Nabble.com.
>>>>>> 
>>>>>> ---------------------------------------------------------------------
>>>>>> 
>>>>>> 
>>> 
>>>>>> 
>> To unsubscribe, e-mail: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=5713590&i=0>
>>>>>> For additional commands, e-mail: [hidden
>>>>>> email]<http://user/SendEmail.jtp?type=node&node=5713590&i=1>
>>>>>> 
>>>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> 
>>>> 
>> To unsubscribe, e-mail: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=5713590&i=2>
>> 
>>>> For additional commands, e-mail: [hidden
>>>> email]<http://user/SendEmail.jtp?type=node&node=5713590&i=3>
>>>> 
>>>> 
>>>> 
>>>> ------------------------------ If you reply to this email, your
>>>> message will be added to the discussion below:
>>>> 
>>>> 
>> http://tapestry.1045711.n5.nabble.com/javascript-and-tapestry-reloading-a-list-tp5713535p5713590.html
>>>> 
>>>> 
>> To unsubscribe from javascript and tapestry - reloading a list, click
>>>> here<
>> 
>>>> 
>>>> 
>> .
>>>> NAML<
>> http://tapestry.1045711.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>> 
>>>> 
>>> 
>>>> 
>>> 
>>> -- View this message in context:
>>> 
>> http://tapestry.1045711.n5.nabble.com/javascript-and-tapestry-reloading-a-list-tp5713535p5713594.html
>> 
>>> 
>>> 
>> Sent from the Tapestry - User mailing list archive at Nabble.com.
>> -----BEGIN PGP SIGNATURE-----
>> Version: GnuPG v1.4.11 (GNU/Linux)
>> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
>> 
>> iEYEARECAAYFAk/Ln9cACgkQbmZsMyUPuXTZTwCgtJ62sqJCrCo/byq5Expm6NGA
>> soUAoIVJJQcTg01unygTONTAM2YXEF+v
>> =Q3O2
>> -----END PGP SIGNATURE-----
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [hidden 
>> email]<http://user/SendEmail.jtp?type=node&node=5713595&i=1>
>> For additional commands, e-mail: [hidden 
>> email]<http://user/SendEmail.jtp?type=node&node=5713595&i=2>
>> 
>> 
>> 
>> ------------------------------
>> If you reply to this email, your message will be added to the discussion
>> below:
>> 
>> http://tapestry.1045711.n5.nabble.com/javascript-and-tapestry-reloading-a-list-tp5713535p5713595.html
>> To unsubscribe from javascript and tapestry - reloading a list, click
>> here<http://tapestry.1045711.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=5713535&code=YWxleGFuZGVyLnNvbW1lckBnbWFpbC5jb218NTcxMzUzNXwxMDUzMzQxMzM4>
>> .
>> NAML<http://tapestry.1045711.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>> 
> 
> 
> --
> View this message in context: 
> http://tapestry.1045711.n5.nabble.com/javascript-and-tapestry-reloading-a-list-tp5713535p5713600.html
> Sent from the Tapestry - User mailing list archive at Nabble.com.


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

Reply via email to