我怎样才能获得地理编码器地址来支持bean?

时间:2012-02-03 22:52:33

标签: jsf-2 primefaces

使用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>

1 个答案:

答案 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());
}