答案 0 :(得分:6)
问题1:放置标记后,无法重新放置标记。
此问题是由以下原因引起的:
您将纬度和经度绑定到与持有地图模型(NewOfferSupportController
)的bean不同的bean(MapBean
)。您应该在PrimeFaces展示中使用MapBean
示例作为NewOfferSupportController
bean的设计起点。它即存储标记集。隐藏的输入必须指向该bean,因为在addMarker()
方法中将添加这些值。在展示示例中,您只需重命名MapBean
类名称,并在#{mapBean}
视图中重命名#{newOfferSupportController}
引用。
您的NewOfferSupportController
bean是请求作用域,但它应该是视图作用域。
@ManagedBean
@ViewScoped
public class NewOfferSupportController implements Serializable {}
只要您通过Ajax与同一表单进行交互,就可以查看作用域bean。但是请求scoped bean会在每个请求上重新创建(因此也会在每个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>
代码,只是将其保持不变)
豆:
@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.
}