Загрузка данных для балуна метки по требованию
В примере показано, как осуществлять загрузку данных для балуна объекта по требованию.
index.html
object_manager_balloon_async.js
<!DOCTYPE html>
<html>
<head>
<title>Загрузка данных для балуна метки по требованию</title>
<meta
http-equiv="Content-Type"
content="text/html; charset=utf-8"
/>
<!--
Укажите свой API-ключ. Тестовый ключ НЕ БУДЕТ работать на других сайтах.
Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
-->
<script
src="https://api-maps.yandex.ru/2.1/?lang=ru-RU&apikey=<ваш API-ключ>"
type="text/javascript"
></script>
<script
src="https://yandex.st/jquery/2.2.3/jquery.min.js"
type="text/javascript"
></script>
<script
src="object_manager_balloon_async.js"
type="text/javascript"
></script>
<style>
html,
body,
#map {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
}
</style>
</head>
<body>
<div id="map"></div>
</body>
</html>
ymaps.ready(init);
function init() {
var myMap = new ymaps.Map(
"map",
{
center: [55.76, 37.64],
zoom: 10,
},
{
searchControlProvider: "yandex#search",
}
),
objectManager = new ymaps.ObjectManager({
// Мы хотим загружать данные для балуна перед открытием, поэтому
// запретим автоматически открывать балун по клику.
geoObjectOpenBalloonOnClick: false,
});
myMap.geoObjects.add(objectManager);
$.ajax({
url: "data.json",
}).done(function (data) {
objectManager.add(data);
});
// Функция, эмулирующая запрос за данными на сервер.
function loadBalloonData(objectId) {
var dataDeferred = ymaps.vow.defer();
function resolveData() {
dataDeferred.resolve("Данные балуна");
}
window.setTimeout(resolveData, 1000);
return dataDeferred.promise();
}
function hasBalloonData(objectId) {
return objectManager.objects.getById(objectId).properties
.balloonContent;
}
objectManager.objects.events.add("click", function (e) {
var objectId = e.get("objectId"),
obj = objectManager.objects.getById(objectId);
if (hasBalloonData(objectId)) {
objectManager.objects.balloon.open(objectId);
} else {
obj.properties.balloonContent = "Идет загрузка данных...";
objectManager.objects.balloon.open(objectId);
loadBalloonData(objectId).then(function (data) {
obj.properties.balloonContent = data;
objectManager.objects.balloon.setData(obj);
});
}
});
}