Ответ 1
Проблема 1: После размещения маркера ее нельзя снова разместить.
Эта проблема вызвана следующими вещами:
-
Вы привязали широту и долготу к другому bean (
NewOfferSupportController
), чем bean, который содержит модель карты (MapBean
). Вы должны использовать примерMapBean
в витрине PrimeFaces как отправную точку дизайна дляNewOfferSupportController
bean. В нем хранится набор маркеров. Скрытые входы должны указывать на bean, потому что в методеaddMarker()
эти значения будут добавлены. Из примера витрины вам просто нужно переименовать имя классаMapBean
и переименовать#{mapBean}
ссылки в представлении#{newOfferSupportController}
. -
Ваш
NewOfferSupportController
bean - это область запроса, в то время как она должна быть видимой.@ManagedBean @ViewScoped public class NewOfferSupportController implements Serializable {}
Просмотр области видимости beans в режиме реального времени, пока вы взаимодействуете с той же формой Ajax. Но запрос, скоординированный beans, воссоздается по каждому запросу (и, следовательно, также по каждому запросу Ajax!), Тем самым уничтожая маркеры, которые помещаются на карте, и входы, которые вводятся перед добавлением маркеров.
Проблема 2: в том же виде, где есть карта, есть некоторые другие элементы, такие как текстовые поля. На самом деле форма вообще не передается (это не произошло до того, как я добавил карту), почему карта нарушает проверку?
Это работает для меня. Вероятно, это вызвано тем, что ваш NewOfferSupportController
помещен в область запроса вместо области представления.
Напомним, вот код, который я использовал в своем тесте:
Вид:
<p:growl id="messages" showDetail="true" />
<h:form>
<p:gmap id="gmap" center="36.890257,30.707417" zoom="13" type="HYBRID" style="width:600px;height:400px"
model="#{mapBean.mapModel}" onPointClick="handlePointClick(event);" widgetVar="map" />
<h:inputText value="#{mapBean.input}" required="true" />
<p:commandButton value="submit" action="#{mapBean.submit}" update="messages" />
</h:form>
<p:dialog widgetVar="dlg" effect="FADE" effectDuration="0.5" close="false" fixedCenter="true">
<h:form prependId="false">
<h:panelGrid columns="2">
<h:outputLabel for="title" value="Title:" />
<p:inputText id="title" value="#{mapBean.title}" />
<f:facet name="footer">
<p:commandButton value="Add" actionListener="#{mapBean.addMarker}"
update="messages" oncomplete="markerAddComplete()"/>
<p:commandButton value="Cancel" onclick="return cancel()"/>
</f:facet>
</h:panelGrid>
<h:inputHidden id="lat" value="#{mapBean.lat}" />
<h:inputHidden id="lng" value="#{mapBean.lng}" />
</h:form>
</p:dialog>
(я не изменил код <script>
в примере витрины, просто добавьте его без изменений)
Bean:
@ManagedBean
@ViewScoped
public class MapBean implements Serializable {
private MapModel mapModel;
private String title;
private double lat;
private double lng;
private String input;
public MapBean() {
mapModel = new DefaultMapModel();
}
public void addMarker(ActionEvent actionEvent) {
mapModel.addOverlay(new Marker(new LatLng(lat, lng), title));
addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marker Added", "Lat:" + lat + ", Lng:" + lng));
}
public void submit() {
addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Form submitted", "Amount markers: " + mapModel.getMarkers().size() + ", Input: " + input));
}
public void addMessage(FacesMessage message) {
FacesContext.getCurrentInstance().addMessage(null, message);
}
// Getters+setters.
}