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.

Reply via email to