-----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] < 
> ml-node+s1045711n5713590...@n5.nabble.com>
> 
> 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<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-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: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to