Подвижная позиция маркера - обновить позицию маркера (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. На странице HTML я хочу показать некоторые маркеры и подвижный маркер (текущая выбранная "станция"). Его значения долготы и широты хранятся в некоторых переменных с помощью valueChangeListener. Когда я использую кнопку Подтверждение, позиция сохраняется в объекте станции. Затем все станции перезагружаются и форма обновляется. Когда я выбираю станцию, ее новая позиция отображается на карте - все работает. Если я переместил маркер и нажал на кнопку 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>
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.
Может быть, вы можете использовать перетаскиваемые маркеры PrimeFaces;
http://www.primefaces.org/showcase/ui/gmapDraggableMarkers.jsf
Что за код стоит (#{XBean.cancelOperation}[1])?
Будет приятно прислать нам пример войны с этой проблемой, чтобы мы могли помочь вам [2].
[1] Я ожидаю установить позиции маркера по умолчанию в действии сброса.
[2] http://groups.google.com/group/gmaps4jsf-dev
Я добавил пример вашего дела: http://www.mashups4jsf.com/gmaps4jsf-test/pages/markersServerSideEvents2.jsf
Жаль, что это помогает!