Как я могу получить адрес геокодера для бина? - PullRequest
0 голосов
/ 04 февраля 2012

Использование PrimeFaces p: gmap компонент.

У меня есть страница с компонентом gmap с набором маркеров.
Я хочу отобразить уличный адрес в gmapInfoWindow и передать его компоненту поддержки. Когда я нажимаю на маркер карты, я вызываю функцию javascript, чтобы получить обратный адрес геокодера. Я могу получить адрес и отобразить его в диалоговом окне предупреждения javascript, но не могу его заполнить переменной бина или информационного маркера.

Переменная заполняется, но не обновляется, пока в следующий раз я не нажму на маркер. В результате адреса всегда на один маркер щелкаются позади.

Кто-нибудь знает, как я могу получить адрес для обновления во время текущей сессии страницы? Спасибо.

В коде базового компонента onMapMarkerSelect просто есть оператор 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 голосов
/ 04 февраля 2012

Вот общее решение, я думаю, вы можете добиться большего, если найдете способ вызвать событие на inputHidden без использования кнопки

b.t.w: jQuery поставляется с простыми лицами, поэтому вы можете использовать его без каких-либо дополнительных включений

вместо

<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 = "address" на execute = "@ form")

и в коде 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());
}
...