2012-02-03 110 views
0

使用PrimeFaces p:gmap组件。如何将地址解析器地址获取到支持bean?

我有一个带有一组标记的gmap组件的页面。
我想在gmapInfoWindow中显示街道地址,并将它传递给backing bean。 当我点击地图标记时,我调用一个javascript函数来获取反向地理编码器地址。 我可以获取地址并将其显示在JavaScript警告对话框中,但我无法将其填充到支持bean变量或info标记中。

变量确实被填充,但直到下次单击标记时才会更新。 因此,地址始终是一个标记点​​击后面。

有谁知道我可以如何获取地址在当前页面会话期间更新? 谢谢。

MapMarkerSelect上的支持bean代码只有一个System.out.println语句来显示mapAddress变量。
这里是页面代码:

   <h:form prependId="false" > 
        <p:gmap id="gmap" center="#{mappingSessionBean.mapCenter}" zoom="#{mappingSessionBean.mapZoom}" type="HYBRID" rendered="true" 
          style="#{mappingSessionBean.polygonGmapStyle}" onPointClick="handlePointClick(event);" 
          model="#{mappingSessionBean.mapModel}" fitBounds="#{mappingSessionBean.fitBoundsFlag}" 
          widgetVar="map" > 
         <p:ajax id="gmapAjax" event="overlaySelect" immediate="true" onstart="handlePointClick(event);" listener="#{mappingSessionBean.onMapMarkerSelect}" /> 
         <p:gmapInfoWindow id="infoWindow" > 
          <p:outputPanel > 
           <h:panelGrid columns="1" > 
            <h:outputText id="infoWindowTitle" value="#{mappingSessionBean.selectedMarker.title}" /> 
            <h:outputText id="infoWindowAddress" value="#{mappingSessionBean.mapAddress}" rendered="true" /> 
            <p:commandButton value="Zoom In" action="#{mappingSessionBean.selectedViewInfoListener}" update="gmap" /> 
           </h:panelGrid> 
          </p:outputPanel> 
         </p:gmapInfoWindow> 
        </p:gmap> 
        <h:inputHidden id="address" value="#{mappingSessionBean.mapAddress}" /> 
       </h:form > 

     <script type="text/javascript" > 
      function handlePointClick(event) { 
       if(navigator.geolocation) 
       { 
        browserSupportFlag = true; 
        var latlng = event.latLng; 
        geocoder = new google.maps.Geocoder(); 
        geocoder.geocode({'latLng': latlng}, function(results, status) 
        { 
         if(status == google.maps.GeocoderStatus.OK) 
         { 
          alert(results[0].formatted_address); 
          document.getElementById('address').value = results[0].formatted_address; 
          document.getElementById('infoWindowAddress').value = results[0].formatted_address; 
         } 
         else 
         { 
          alert("Geocoder failed due to: " + status); 
         } 
        }); 
       } 
       else 
       { 
        alert("No Geolocation"); 
       } 
      } 
     </script> 

回答

0

这里是一个通用的解决方案,我想你可以做的更好,如果你会找到一种方式来触发inputHidden事件,而无需使用按钮

BTW :jQuery提供primefaces所以你可以使用它无需任何额外的包括

,而不是

<h:inputHidden id="address" value="#{mappingSessionBean.mapAddress}" /> 

<f:ajax listener="#{mappingSessionBean.myajax}" execute="address"> 
     <h:inputHidden id="address" value="#{mappingSessionBean.mapAddress}" /> 
     <h:commandButton id="addressBtn" style="display:none"/> 
    </f:ajax> 

(可以代替执行= “address” 的执行= “@表”)

和JS代码替换

document.getElementById('address').value = results[0].formatted_address; 

jQuery("#address").val(results[0].formatted_address); 
jQuery("#addressBtn").click(); // this will trigger the ajax listener 

和最后在你的bean中添加ajax监听器本身的实现

public void myajax(AjaxBehaviorEvent event) { 
    System.out.println(getMapAddress()); 
}