Клуб API Карт

Подгрузка содержимого балуна при его открытии

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

Метки загружаются на кату через LoadingObjectManager


1. Нужно создать шаблон балуна, в который загружать только тест, что бы не грузить весь HTML
2. Нужно обеспечить загрузку своего текста в балун при открытии балуна на каждой метке.

YMap.events.add('balloonopen', function (e) {
//здесь загружаем текст с сервера. 
});


Примеры в документации есть, но когда метка создается явно, и есть к ней прямой доступ. А вот когда метки создаюся через LoadingObjectManager не могу понять, как такое реализовать.

8 комментариев
Роман Ковригин
27 января 2016, 22:29

Спасибо большое. Но простите, но это ужас. Выглядит как костыль. Если есть событие открытия балуна, то совершенно логично, что оттуда должна быть возможность получить ссылку на объект этого самого балуна. И возможность поменять его контент вызовом одного метода. То есть все должно делаться одной строкой.

 

Точно нет другого способа? 

Лично я не вижу тут ужаса. В ОМ нет никаких объектов балуна, и нет никаких меток. Он держит до 50 тыс объектов и инстанцируя столько классов ваш браузер просто умрет.

Есть только один балун – балун карты, который управляется через менеджер и коллекция оверлеев, на которую делегируются события.

Если вы сами знаете как логично, а как нет – ок, сделайте одной строкой, вызовом одного метода. удачи...

Роман Ковригин
27 января 2016, 22:29

Причем тут 50 тысяч объектов? Есть один объект - открытый балун. Это объект? Ладно, пусть балун не объект, но есть плейсмарк, на ктором открылся балун. Почему я не могу из события получить на него ссылку, и поменять текст балуна?

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


Что-то типа:


YMap.events.add('balloonopen', function (e) {
    var placemark= e.get('target');
    placemark.properties.set('balloonContent', 'Мой текст');
}); 


И в чем тут проблема? Нельзя передать в событие ссылку на объект, кторый уже создан и есть на карте? Почему? 

Ну нет там никакого плейсмарка. Вы не понимаете или не читаете что я вам пишу.

ObjectManager – технология предназначенная для одновременного показа БОЛЬШОГО количества объектов на карте. Эта производительность дается небесплатно, там нет никаких меток, нет балунов нет ничего. Есть только ваш исходный JSON по которому рисуется отображение меток (оверлеи).

 

Если у вас 100 меток – вам точно не нужен ОМ, используйте обычные метки и коллекции

Роман Ковригин
27 января 2016, 22:29

У меня не 100 меток, а намного больше. 

 

Зачем отрисовавть большое количество балунов, если он один на карте. Всегда один. Или плейсмарк, по которому кликнули. Меня не волнует как отрисованный все остальные 10 000 плесмарков, но есть лишь ОДИН, на который я вот сейчас кликнул. Причем тут дополнительная нагрузка? Это такая большая нагрузка создать один объект, и передать на него ссылку в событие? 


Все равно за ссылку на пример спасибо, я завтра еще поколдую, возможно удастся переписать этот код во что-то челоековаримое. Вот я наприме не очень понял зачем запрещать открывать балун автоматически, а потом вешать событие на онклик. Но могу предположить, что вероятно лишь для того, что бы сначала загрузить в балун данные, потом его показать. Но мне то как раз надо сначала показать балун, сообщить пользователю что данные загружаются, потом уже подгружать данные. Так логично. Я так понимаю, что с событием balloonopen я могу сделать аналогично примеру, просто загрузка данный у меня будет после открытия балуна.

Зачем отрисовавть большое количество балунов, если он один на карте. Всегда один. Или плейсмарк, по которому кликнули. Меня не волнует как отрисованный все остальные 10 000 плесмарков, но есть лишь ОДИН, на который я вот сейчас кликнул. Причем тут дополнительная нагрузка? Это такая большая нагрузка создать один объект, и передать на него ссылку в событие? 

Не отрисовывать большое количество балунов, а создавать инстанции менеджера балуна (и еще много чего) у каждой метки. Вы посмотрите на класс геообъекта, в нем много чего есть и я сейчас не готов обсуждать ваши гениальные идеи оптимизации 

 

Вот я наприме не очень понял зачем запрещать открывать балун автоматически, а потом вешать событие на онклик. Но могу предположить, что вероятно лишь для того, что бы сначала загрузить в балун данные, потом его показать. Но мне то как раз надо сначала показать балун, сообщить пользователю что данные загружаются, потом уже подгружать данные. Так логично. Я так понимаю, что с событием balloonopen я могу сделать аналогично примеру, просто загрузка данный у меня будет после открытия балуна.

 

Это да, немного криво. Пример писали документаторы

На мой взгляд самый нормальный вариант загружать данные из макета балуна

 

http://jsfiddle.net/tj4ekf8d/1/

 

Роман Ковригин
27 января 2016, 22:29

Вот это уже куда элегантнее, спасибо :)