Клуб API Карт

Макет балуна для коллекции полигонов

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

Здравствуйте.

У меня сть коллекция полигонов, т.е.

var myCollection = new ymaps.GeoObjectCollection()

на каждый из них навешивается событие, при котором должен всплывать балун. Проблема в том, что у меня для этих балунов не применяются макеты. Скажите, как правильно делать? Я определяю макет:

var BalloonContentLayout = ymaps.templateLayoutFactory.createClass('HTML_верстка').

Пробую применить шаблон при создании коллекции,

balloonContentLayout : BalloonContentLayout

пробую запустить цикл myCollection.each

.properties.set('balloonContentLayout', 'BalloonContentLayout')

но результат один: при клике открывается пустой балун. Подскажите, что я неправильно делаю?

5 комментариев

 

на каждый из них навешивается событие,

Это неправильно, нужно использовать event delegation и навешивать один обработчик на коллекцию. Полигон, на котором произошло событие можно получить в обработчике как e.get('target')

 

пробую запустить цикл myCollection.each

.properties.set('balloonContentLayout', 'BalloonContentLayout')

Это 3 раза неправильно:

1. макеты это не данные, а опции, - нужно делать options.set

2. макет передается по ссылке, а не какой-то строкой, нужно делать options.set('balloonContentLayout', BalloonContentLayout);

– второй аргумент без кавычек

3. опции наследуются от родителя, т.е. ничего перебирать не надо, достаточно назначить эту опцию вашей коллекции

myCollection.options.set('balloonContentLayout', BalloonContentLayout);

или при создании вторым параметром в конструктор

var myCollection = new ymaps.GeoObjectCollection(null, { balloonContentLayout: BalloonContentLayout });

Скажите пожалуйста, а как в таком случае в шаблон передать значения поля полигона, на котором сработало событие?

Шаблоны поддерживают вставку данных из properties геообъекта, через специальный синтаксис

В документации есть примеры

Важно ли где создается балун: в коллекции или при добавлении полигона внутри полигона? Я так понимаю, если прописать 

var myCollection = new ymaps.GeoObjectCollection(null, { balloonContentLayout: BalloonContentLayout })

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

Нет, всё будет как надо.

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