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.