刷新javascript中的gmap标记
我需要刷新、添加新标记或删除primefaces gmap上的标记。 通过callBackParam,我将标记传递给xhtml中的javascript。 但是,当映射刷新时,永远不会触发事件OverlySelect。 ManageBean作用域是ViewScope刷新javascript中的gmap标记,javascript,google-maps,jsf,primefaces,Javascript,Google Maps,Jsf,Primefaces,我需要刷新、添加新标记或删除primefaces gmap上的标记。 通过callBackParam,我将标记传递给xhtml中的javascript。 但是,当映射刷新时,永远不会触发事件OverlySelect。 ManageBean作用域是ViewScope public void ajaxPoll() { Marker[] newMarkers = new Marker[mapLoadModel.getMarkers().size()]; for(int i=0;i &
public void ajaxPoll() {
Marker[] newMarkers = new Marker[mapLoadModel.getMarkers().size()];
for(int i=0;i < newMarkers.length;i++){
newMarkers[i]=mapLoadModel.getMarkers().get(i);
}
RequestContext.getCurrentInstance().addCallbackParam("newMarkers",new Gson().toJson(newMarkers));
logger.info("refresco marcadores");
}
public void ajaxPoll(){
Marker[]newMarkers=新标记[mapLoadModel.getMarkers().size()];
for(int i=0;i
javascript:
//<![CDATA[
function handleComplete(xhr, status, args){
var gmap = PF('gMapWV').getMap();
for(var i in gmap.markers)
{
gmap.markers[i].setMap(null);
}
gmap.markers.length=0;
var newMarkers = eval('(' + args.newMarkers + ')');
for(var i in newMarkers)
{
var newMarker = newMarkers[i];
var marker = new google.maps.Marker({
id: newMarker.id,
map: gmap,
position: newMarker.latlng,
icon:newMarker.icon,
title:newMarker.title,
clickable:true
});
}
}
// ]]>
//
和地图:
<p:poll interval="#{manageLoadExecution.refreshInterval}" listener="#{manageLoadExecution.ajaxPoll}" oncomplete="handleComplete(xhr, status, args)" process="@this" />
<p:gmap widgetVar="gMapWV" id="gMapWV" center="#{manageLoadExecution.latitude} , #{manageLoadExecution.longitude}" zoom="#{manageLoadExecution.zoomLevel}" fitBounds="false" type="terrain" model="#{manageLoadExecution.mapLoadModel}" disableDefaultUI="false" styleClass="map" >
<p:ajax event="overlaySelect" listener="#{manageLoadExecution.onMarkerSelect}" />
<p:gmapInfoWindow id="infoWindow" maxWidth="400" >
<p:outputPanel style="text-align: left; display: block; margin: auto; width:370px" >
刷新后,标记将显示在屏幕上,但OverlySelect事件从未触发,并且信息窗口未打开
我想移除所有的标记,我正在移除一些标记,使事件不会触发
求求你,任何帮助!
非常感谢。我成功了!
我没有在javascript scriptlet中为新标记添加id。
最后,在javascript代码中,我调用_render()方法来配置标记和侦听器
以下是javascript脚本:
<script>
//<![CDATA[
function handleComplete(xhr, status, args){
var gmap = PF('gMapWV').getMap();
var newMarkers = eval('(' + args.newMarkers + ')');
for(var i in gmap.markers)
{
var oldMarker = gmap.markers[i];
var newMarker = newMarkers[i];
if(newMarker != null){
oldMarker.setPosition(newMarker.latlng);
oldMarker.title=newMarker.title;
oldMarker.setMap(gmap);
oldMarker.id=newMarker.id;
}else{
oldMarker.setMap(null);
}
}
var oldMarkersLength = gmap.markers.length;
var newMarkersLength = newMarkers.length;
for(var i = oldMarkersLength;i < newMarkersLength;i++)
{
var newMarker = newMarkers[i];
var marker = new google.maps.Marker({
position: newMarker.latlng,
title:newMarker.title,
clickable:true,
id:newMarker.id
});
gmap.markers[i]= marker;
}
PF('gMapWV').addOverlays(gmap.markers);
PF('gMapWV')._render();
}
// ]]>
</script>
//
如果列表减小了大小,我会将保留标记设置为null以重用,如果需要的话
我希望这能帮助那些坚持gmap和primefaces的人
谢谢大家的建议试着这样做吧,这对我很有用(对于那些不想刷新地图的人):
你能提供PF版本吗?你检查过不同的浏览器吗?嗨!非常感谢库克杰。我使用的是PF 5.1,我已经登录了Chrome和Firefox,但这两种浏览器都不能使用。再次感谢如果您可以创建()我可以使用未压缩的js Source进行检查我想我必须为现有OverlySelect事件订阅所有新标记,但我不知道如何执行:(这是我的怀疑…让我快速查看一下相关的PF js文件,这似乎过于复杂。您正在重用旧的
gmap.markers
数组,但这似乎是一个事先优化的情况。您可以从gmap
中删除所有标记,然后再次添加它们。我发现,在删除所有标记后l标记并执行gmap.markers.length=0
,然后使用new google.maps.Marker({map:map})添加新标记
,数组gmap.markers
为空。因此,再次替换标记的第二次过程实际上不会删除任何内容。我找到的解决方案很简单,但看起来像是一个黑客:使用maps.markers.push(marker)
。
var gmap = PF('gmap').getMap();
var marker = new google.maps.Marker({
id: json.id,
map: gmap,
position: json.latlng,
icon: json.icon,
title: json.title,
draggable: true,
clickable:true
});
gmap.markers[gmap.markers.length] = marker;
PF('gmap').addOverlay(marker);
PF('gmap').configureMarkers();
PF('gmap').addOverlays(gmap.markers);