使用PrimeFaces p:gmap组件。
我有一个带有一组标记的gmap组件的页面 我想在gmapInfoWindow中显示街道地址,并将其传递给支持bean。 当我点击地图标记时,我调用javascript函数来获取反向地理编码器地址。 我可以获取地址并在javascript警告对话框中显示它,但我不能让它填充支持bean变量或信息标记。
变量确实已填满,但直到下次单击标记时才会更新。 因此,地址始终是一个标记点击后面。
有谁知道如何在当前页面会话期间获取要更新的地址? 感谢。
onMapMarkerSelect上的支持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 :(得分:0)
这是一个通用的解决方案,我想你可以做得更好,如果你找到一种方法在inputHidden上触发一个事件而不使用按钮
b.t.w: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>
(你可以用execute =“@ form”替换execute =“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());
}