我正在使用asp mvc以及jquery和google maps api来显示和更新地图上的位置。
我的目标:
使用标记指向多个位置
使用信息气泡info bubble repo
OnClick刷新标记和信息气泡
到目前为止我取得的成就:
我可以加载地图,放置指针并显示信息气泡。经过几个小时的挣扎之后,我还设法在进行ajax调用时刷新标记。
我的问题:
第一次更新后,标记会正确刷新,但信息气泡仍然存在(我无法弄清楚如何清除它们)
新气泡与新标记一起显示但这些气泡不包含任何数据
第二次更新后,所有标记都会消失,但所有信息气泡仍然存在
初始加载
致电1后(点击租借按钮)
致电2(点击购买按钮)
somePartialView.cshtml
@Html.HiddenFor(m => m.LatLng, new { @id = "latLng" })
<div id="map" class="google-maps">
<div id="map-canvas"></div>
</div>
的Javascript
NB:在测试时我很难对viewModel中的lat和lng值进行编码,所以我知道每次调用时只会返回四个值,这就是为什么我有四个硬编码的原因字符串到contentString数组。
$(document).ready(function () {
var map;
var iterator = 0;
var markers = [];
var markerLatLng = [];
var contentString = [
'<div class="infobox-inner"><a href="08_Properties_Single.html"><img src="assets/img/icon-1.png" alt=""/><span>Sarkkara Villa</span></a></div>',
'<div class="infobox-inner"><a href="08_Properties_Single.html"><img src="assets/img/icon-2.png" alt=""/><span>Sarkkara Flat</span></div>',
'<div class="infobox-inner"><a href="08_Properties_Single.html"><img src="assets/img/icon-3.png" alt=""/><span>Sarkkara Commercial</span></div>',
'<div class="infobox-inner"><a href="08_Properties_Single.html"><img src="assets/img/icon-4.png" alt=""/><span>Sarkkara Appartment</span></a></div>'
];
var latlng = $("#latLng").val();
var aryOfLatLng = latlng.split(';');
loadMarkers(aryOfLatLng);
function loadMarkers(ary) {
$.each(ary, function (index, value) {
if (value !== "") {
var values = value.split(',')
var loc = new google.maps.LatLng(Number(values[0]), Number(values[1]));
markerLatLng.push(loc);
}
})
}
function initialize() {
map = new google.maps.Map(document.getElementById('map-canvas'), {
scrollwheel: false,
zoom: 12,
center: new google.maps.LatLng(52.520816, 13.410186) //Berlin
});
setTimeout(function () {
drop();
}, 1000);
}
// animate markers
function drop() {
for (var i = 0; i < markerLatLng.length; i++) {
setTimeout(function () {
addMarker();
}, i * 400);
}
}
function addMarker() {
var marker = new google.maps.Marker({
position: markerLatLng[iterator],
map: map,
icon: 'assets/img/marker.png',
draggable: false
//,animation: google.maps.Animation.DROP
});
markers.push(marker);
var infoBubble = new InfoBubble({
map: map,
content: contentString[iterator],
position: markerLatLng[iterator],
disableAutoPan: true,
hideCloseButton: true,
shadowStyle: 0,
padding: 0,
borderRadius: 3,
borderWidth: 1,
borderColor: '#74d2b2',
backgroundColor: '#ffffff',
backgroundClassName: 'infobox-bg',
minHeight: 35,
maxHeight: 230,
minWidth: 200,
maxWidth: 300,
arrowSize: 5,
arrowPosition: 50,
arrowStyle: 0
});
setTimeout(function () {
infoBubble.open(map, marker);
}, 200);
google.maps.event.addListener(marker, 'click', function () {
if (!infoBubble.isOpen()) {
infoBubble.open(map, marker);
}
else {
infoBubble.close(map, marker);
}
});
iterator++;
}
google.maps.event.addDomListener(window, 'load', initialize);
$("#rent").click(function () {
ajaxRequest("/Map/_IsForSale", false)
})
$("#buy").click(function () {
ajaxRequest("/Map/_IsForSale", true)
})
function ajaxRequest(targetUrl, data) {
$.ajax({
cache: false,
url: targetUrl,
type: "POST",
data: { 'isForSale': data },
success: function (data) {
successCallBack(data);
},
error: function (request, status, error) {
alert(error)
}
});
}
// Removes the markers from the map, but keeps them in the array. It will hide all markers.
function clearMarkers() {
for (var i = 0; i < markers.length; i++) {
markers[i].setMap(null);
}
}
function successCallBack(data) {
clearMarkers();
var latlng = data.substring(data.indexOf("value=") + 7, data.indexOf(";\""));
var ary = latlng.split(';');
$.each(ary, function (index, value) {
if (value !== "") {
var values = value.split(',')
var loc = new google.maps.LatLng(Number(values[0]), Number(values[1]));
markerLatLng.push(loc);
}
})
drop();
}
});
答案 0 :(得分:1)
<强> 1。第一次更新后,标记正确刷新,但信息气泡仍然存在(我无法弄清楚如何清除它们)
就像您创建markers
数组以存储创建的标记一样,以便稍后使用#clearMarkers
清除。我会对infoBubbles做类似的事,例如#clearInfoBubbles
。创建一个infoBubbles
数组来存储信息气泡。根据信息气泡存储库中的源代码(see line 968),您可以使用InfoBubble#close
关闭信息气泡。必要时致电#clearInfoBubbles
。在你的#successCallBack
或许。
<强> 2。新气泡与新标记一起显示但这些气泡不包含任何数据
您正在此处创建infoBubble
var infoBubble = new InfoBubble({
map: map,
content: contentString[iterator],
...
});
带有contentString
的,它只被硬编码为4个元素长。
当#initialize
完成时,iterator
将等于4.随后调用#addMarker
(点击第一个租借按钮时)将尝试创建信息泡泡但是,contentString[4]
为undefined
。 iterator
永远不会重置为0.
第3。第二次更新后,所有标记都会消失,但所有信息气泡仍然存在
所有信息泡沫仍然存在,因为它们永远不会关闭。
我不确定您的“购买”请求是什么回馈给您。我会检查响应是否正在返回您期望的数据。我的猜测是,此时没有创建新标记。