Клуб API Карт

Вызов пользовательсой функции при открытии балуна

Пост в архиве.

Добрый вечер.
Подскажите, пожалуйста, как мне вызвать функцию при открытии балуна, балун открывается в момент установки метки.
Функция осуществляет ajax запрос на сервер и прописывает результат в балуне, в выпадающий список.
Порылся в документации, но не понял как правильно это сделать.
Для начала я попытался вывести простой alert()
myPlacemark.balloon.open(alert('yes - Balloon'))
alert() срабатывает
Потом попытался сделать это функцией
var myAlert = function(){alert('yes - Balloon')}
myPlacemark.balloon.open(myAlert) - результат "0"

 

 myMap.events.add('click', function (e) {
        var myAleRt = function(){alert('yes - Balloon')}
    
        // Создаем метку и задаем изображение для ее иконки
        myPlacemark = new ymaps.Placemark([coords[0].toPrecision(6), [coords[1].toPrecision(6)]], {}, {
          balloonContentBodyLayout:'my#superlayout',
          draggable: true, // Метку можно перетаскивать, зажав левую кнопку мыши.             
          hideIconOnBalloonOpen: false,// Не скрывать иконку метки при открытии балуна
          iconImageHref: '/coffee/admblock/img/zerno-for-map1.png', // картинка иконки
          iconImageSize: [80, 80], // размеры картинки
          iconImageOffset: [-39, -66] ,// смещение картинки
          balloonLayout: "default#imageWithContent",// Задаем макет балуна - пользовательская картинка с контентом
          balloonImageHref: '/coffee/admblock/img/baloon.png',// Картинка балуна
          balloonImageSize: [350, 298],// Размеры картинки балуна
          balloonImageOffset: [-178, -304],// Смещение картинки балуна
          balloonShadow: false // Балун не имеет тени      
        }
        myMap.geoObjects.add(myPlacemark);// Добавление метки на карту
        
        myPlacemark.balloon.open(myAleRt)
}

  Функция выполняющая ajax запрос определяется выше по коду, будет использоваться в других местах кода, и чтобы не растягивать и не дублировать код, хочу вызывать функцию просто по имени

4 комментария

странная логика у вас.

зачем передавать ссылку на функцию в метод open, если он принимает один параметр - массив чисел-координат?

почему нельзя просто сделать

 

myPlacemark.balloon.open();

myAleRt();

 

?

Или может стоит открывать балун только когда данные ajax-ом для него уже загрузятся?

Для этого передать код его открытия через замыкание в callback-функцию AJAX-загрузчика

myAjaxLoader(function (loadedBalloonContent) {    myPlacemark.properties.set({ balloonContent : loadedBalloonContent });    myPlacemark.balloon.open();});

 

ну и имитация AJAX загрузчика:

 

function myAjaxLoader (callback) {    // тут будет AJAX запрос, а пока фейк    setTimeout(function() {         callback('Это контент балуна');    }, 5000);}

Ну а чтобы сделать совсем круто, можно создать свой макет балуна, в контенте которого будет сначала надпись "идет загрузка..." и при получении данных заменять ее на полученный контент, тогда открывать балун можно сразу, без задержки.

 

var myBalloonContentLayout = ymaps.templateLayoutFactory.createClass('

$[properties.balloonContent|идет загрузка...]

');

 

контент будет грузиться не для всего балуна, а только для одного выпадающего списка , остальные элементы остануться без изменений

 

Макет балуна у меня создан...

А можно ли так же создать макет для метки?