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=\"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'] +" "; >>>>>> >>>>>> 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