Позиция подвижного маркера — обновить позицию маркера (GMaps4JSF 1.1.3-u3)

Я использую GMaps4JSF 1.1.3-u3 в приложении JavaEE 6 с JSF 2.0, Facelets, Mojarra 2.0.2 и Primefaces 2.1 на сервере приложений Glassfish v3. На странице xhtml я хочу показать несколько маркеров и подвижный маркер (текущая выбранная «станция»). Его долгота и широта сохраняются в некоторых переменных с помощью valueChangeListener. Когда я использую confirmButton, позиция сохраняется в объекте станции. Затем все станции перезагружаются и форма обновляется. Когда выбираю станцию, на карте отображается ее новое положение - все работает. Если я перемещаю маркер и нажимаю кнопку cancelButton, а затем выбираю ту же станцию ​​в таблице, позиция этого перемещения отображается, хотя cancelOperation восстанавливает старую позицию (stationLongitude и переменные stationLatitude). Это необходимо, потому что valueChangeListener вызывается перед функцией отмены. Я пробовал много вещей, но я не могу выполнить отмену, чтобы после повторного выбора соответствующей станции отображалось старое положение маркера. Это работает только тогда, когда я использую oncomplete="window.location.reload()" на ajax cancelButton! Но это приводит к уродливому обновлению страницы (сначала обновляется ajax, затем перезагружается вся страница). Я не уверен, является ли это проблемой GoogleMaps, GMaps4JSF или Facelets или чем-то еще. Может быть, есть хороший обходной путь или я просто сделал что-то не так! Может быть, можно обновить позицию маркера или маркер имеет внутреннее состояние? Мне интересна любая подсказка! Заранее спасибо!

Фрагмент XHTML:

     <h:form prependId="false" id="xTableForm">
        <div class="xSection" >
            <p:dataTable id="xTable" var="station" value="#{XBean.stations}" 
                selection="#{XBean.selectedStation}" selectionMode="single"
                update="xTableForm pMessages">
                ...
            </p:dataTable>
        </div>

        <h:panelGrid id="mapPanelGrid">
            <m:map width="929px" height="500px"  
            longitude="#{XBean.stationLongitude}" latitude="#{XBean.stationLatitude}" 
            renderOnWindowLoad="false">
                <ui:repeat ... >
                    ... other markers
                </ui:repeat>
                <m:marker id="stationMarker" longitude="#{XBean.stationLongitude}" 
                    latitude="#{XBean.stationLatitude}" jsVariable="sMarker" draggable="true"
                    submitOnValueChange="false" valueChangeListener="#{XBean.valueChangeListener}" >
                    <m:icon imageURL="http://www.google.com/mapfiles/marker_blackS.png"/>
                </m:marker>
                <m:mapControl name="GLargeMapControl" position="G_ANCHOR_BOTTOM_RIGHT"/>
                <m:mapControl name="GMapTypeControl"/>
            </m:map>
        </h:panelGrid>

        <div id="xMenu">
            ...
            <p:commandLink id="confirmButton" value="confirm"
                actionListener="#{XBean.confirm}" update="XTableForm pMessages" />
            <p:commandLink id="cancelButton" value="Cancel"
                actionListener="#{XBean.cancelOperation}" update="XTableForm pMessages" />
        </div>
    </h:form>

person Michael W.    schedule 18.08.2010    source источник


Ответы (4)


Я была такая же проблема. Я исправил это с помощью следующего кода:

private void rebuildRootView()
{
    FacesContext context = FacesContext.getCurrentInstance();
    Application application = context.getApplication();
    ViewHandler viewHandler = application.getViewHandler();
    UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
    context.setViewRoot(viewRoot);
}

Я вызываю этот метод в прослушивателе CancelButton.

person Alex    schedule 19.08.2010

Может быть, вы можете использовать перетаскиваемые маркеры PrimeFaces;

http://www.primefaces.org/showcase/ui/gmapDraggableMarkers.jsf

person Cagatay Civici    schedule 18.08.2010

Что скрывается за кодом (#{XBean.cancelOperation}[1])?
Было бы неплохо прислать нам образец войны с проблемой, чтобы мы могли вам помочь[2].
[1] Я ожидаю чтобы установить позиции маркеров по умолчанию в действии сброса.
[2] http://groups.google.com/group/gmaps4jsf-dev

person Hazem Ahmed Saleh    schedule 18.08.2010
comment
Благодарю вас! [1] метод cancelOperation устанавливает для XBean.stationLongitude и XBean.stationLatitude предыдущие значения (до перемещения маркера). [2] Ваш пример точно воспроизводит проблему. - person Michael W.; 19.08.2010

Я добавил пример вашего случая: http://www.mashups4jsf.com/gmaps4jsf-test/pages/markersServerSideEvents2.jsf

Желаю, чтобы это помогло!

person Hazem Ahmed Saleh    schedule 18.08.2010
comment
Спасибо! Этот пример воспроизводит проблему. [Случай 1] Вы перемещаете маркер и сохраняете, затем нажимаете кнопку сброса › маркер сбрасывается в положение по умолчанию. [Случай 2] Вы перемещаете маркер и не выполняете сохранения, затем нажимаете кнопку сброса › маркер не сбрасывается в исходное положение › вы нажимаете кнопку сброса второй раз › маркер сбрасывается в исходное положение. [Случай 2] Это именно проблема. - person Michael W.; 19.08.2010
comment
Теперь я понял, что вы имеете в виду. Это дефект. Я скоро исправлю: code.google.com/p/gmaps4jsf. /issues/detail?id=139 - person Hazem Ahmed Saleh; 20.08.2010