Loading the placemark balloon data on demand

Open in CodeSandbox

This example shows how to load data for an object's balloon on demand.

<!DOCTYPE html>
<html>
    <head>
        <title>Examples. Working with the balloon in ObjectManager</title>
        <meta
            http-equiv="Content-Type"
            content="text/html; charset=UTF-8"
        />
        <!--
        Set your own API-key. Testing key is not valid for other web-sites and services.
        Get your API-key on the Developer Dashboard: https://developer.tech.yandex.ru/keys/
    -->
        <script
            src="https://api-maps.yandex.ru/2.1/?lang=en_RU&amp;apikey=<your API-key>"
            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({
            /**
             * We want to load data for a balloon before opening,
             * so we disable automatically opening the balloon on click.
             */
            geoObjectOpenBalloonOnClick: false,
        });

    myMap.geoObjects.add(objectManager);

    $.ajax({
        url: "data.json",
    }).done(function (data) {
        objectManager.add(data);
    });

    // Function that emulates a request for data to the server.
    function loadBalloonData(objectId) {
        var dataDeferred = ymaps.vow.defer();
        function resolveData() {
            dataDeferred.resolve("Balloon data");
        }
        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");
        if (hasBalloonData(objectId)) {
            objectManager.objects.balloon.open(objectId);
        } else {
            loadBalloonData(objectId).then(function (data) {
                var obj = objectManager.objects.getById(objectId);
                obj.properties.balloonContent = data;
                objectManager.objects.balloon.open(objectId);
            });
        }
    });
}