Antonio Otero Andria
Antonio Otero Andria

Reputation: 105

Refresh primefaces gmap markers in javascript

I need to refresh, add new markers or remove markers on a primefaces gmap. By a callBackParam I pass the markers to a javascript in xhtml. However when the map refreshes, the event overlaySelect is never fired. ManageBean scope is viewScoped

public void ajaxPoll() {
    Marker[] newMarkers = new Marker[mapLoadModel.getMarkers().size()];

    for(int i=0;i < newMarkers.length;i++){
        newMarkers[i]=mapLoadModel.getMarkers().get(i);
    }
    RequestContext.getCurrentInstance().addCallbackParam("newMarkers",new Gson().toJson(newMarkers));


      logger.info("refresco marcadores");
   }

The javascript:

 //<![CDATA[
 function handleComplete(xhr, status, args){
 var gmap = PF('gMapWV').getMap();
 for(var i in gmap.markers)
{
  gmap.markers[i].setMap(null); 
} 
gmap.markers.length=0;
var newMarkers = eval('(' + args.newMarkers + ')');
for(var i in newMarkers)
    {
    var newMarker = newMarkers[i];
    var marker = new google.maps.Marker({
        id: newMarker.id,
        map: gmap,
        position: newMarker.latlng,
        icon:newMarker.icon,
        title:newMarker.title,
        clickable:true
    });
    }
  }
 // ]]>

And the map:

 <p:poll interval="#{manageLoadExecution.refreshInterval}" listener="#{manageLoadExecution.ajaxPoll}" oncomplete="handleComplete(xhr, status, args)" process="@this" />
 <p:gmap widgetVar="gMapWV" id="gMapWV" center="#{manageLoadExecution.latitude} , #{manageLoadExecution.longitude}"  zoom="#{manageLoadExecution.zoomLevel}" fitBounds="false" type="terrain"  model="#{manageLoadExecution.mapLoadModel}" disableDefaultUI="false" styleClass="map" >
  <p:ajax event="overlaySelect" listener="#{manageLoadExecution.onMarkerSelect}"  />
  <p:gmapInfoWindow id="infoWindow" maxWidth="400"  >
                    <p:outputPanel style="text-align: left; display: block; margin: auto; width:370px" >

After refresh the markers are show on screen, but the overlaySelect event is never fired and the infowindow is not open.

I guess that removing all the markers I'm removing some that makes the event not fires.

Please, any help! Thank you very very much.

Upvotes: 0

Views: 3777

Answers (2)

Izaias Dantas
Izaias Dantas

Reputation: 79

Try to do this, it work to me (for those don't want refresh the map):

        var gmap = PF('gmap').getMap();

        var marker = new google.maps.Marker({
            id: json.id,
            map: gmap,
            position: json.latlng,
            icon: json.icon,
            title: json.title,
            draggable: true,
            clickable:true
        });

        gmap.markers[gmap.markers.length] = marker; 
        PF('gmap').addOverlay(marker); 

PF('gmap').configureMarkers();
PF('gmap').addOverlays(gmap.markers); 

Upvotes: 0

Antonio Otero Andria
Antonio Otero Andria

Reputation: 105

I made it! I missed to add an id the the new marker in javascript scriptlet. Finally in javascript code I call _render() method to configure markers and listeners.

Here is the javascript scriptlet:

<script>
//<![CDATA[
function handleComplete(xhr, status, args){
   var gmap = PF('gMapWV').getMap();
   var newMarkers = eval('(' + args.newMarkers + ')');
   for(var i in gmap.markers)
   {
      var oldMarker = gmap.markers[i];
      var newMarker = newMarkers[i];
      if(newMarker != null){
         oldMarker.setPosition(newMarker.latlng);
         oldMarker.title=newMarker.title;
         oldMarker.setMap(gmap);
         oldMarker.id=newMarker.id;
      }else{
         oldMarker.setMap(null);
      }
   } 
   var oldMarkersLength = gmap.markers.length;
   var newMarkersLength = newMarkers.length;

   for(var i = oldMarkersLength;i < newMarkersLength;i++)
      {
      var newMarker = newMarkers[i];
      var marker = new google.maps.Marker({
          position: newMarker.latlng,
          title:newMarker.title,
          clickable:true,
          id:newMarker.id
      });
      gmap.markers[i]= marker;
      }
    PF('gMapWV').addOverlays(gmap.markers);
    PF('gMapWV')._render();

 }
// ]]>
</script>

If the list decrease the size I set the remain markers to null to reuse then if I need it.

I hope this can help anyone stuck with gmap and primefaces.

Thanks everyone for suggestions

Upvotes: 2

Related Questions