Нужно сделать балун с аккордионом (раскрывающимся дивом) на Яндекс Картах
Нужно сделать балун с аккордионом. Делаю на основе примера из песочницы Яндекс Карт - https://yandex.ru/dev/maps/jsbox/2.1/balloon_autopan/
Суть проблемы: Если делаю балун с изначально открытым аккордионом - при закрытии аккордиона балун не меняет размер. На месте аккордиона остается пустое место. Если делаю аккордион изначально закрытым - балун не меняет размер при открытии и аккордион не видно.
В документации написано, что у шаблонов есть метод onSublayoutSizeChange, который "автоматически вызывается при изменении размеров вложенного макета, добавленного с параметром 'observeSize'". https://yandex.ru/dev/maps/jsapi/doc/2.1/ref/reference/layout.templateBased.Base.html Казалось бы это и должно произойти в моем случае, но этот метод не вызывается.
Вот balloonLayout. Указан "observeSize". В методе build навешиваю слушатель события
function createDistrictLayout() {
districtLayout = ymaps.templateLayoutFactory.createClass(
'<div class="balloon top">' +
'<div class="arrow"></div>' +
'<div class="balloon-inner">' +
'$[[options.contentLayout observeSize]]' +
'</div>' +
'</div>', {
/**
* Строит экземпляр макета на основе шаблона и добавляет его в родительский HTML-элемент.
* @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#build
* @function
* @name build
*/
build: function() {
this.constructor.superclass.build.call(this);
this._$element = $('.balloon', this.getParentElement());
this.applyElementOffset();
this._$element.find('.close')
.on('click', $.proxy(this.onCloseClick, this));
document.getElementById('chevron').addEventListener('click', (e) => {
let collapsible = document.getElementById('collapsible')
if (collapsible.style.display === "block") {
collapsible.style.display = "none";
} else {
collapsible.style.display = "block";
}
})
},...
Вот balloonContentLayout:
// Создание вложенного макета содержимого балуна.
districtContentLayout = ymaps.templateLayoutFactory.createClass(`
<div class="balloon-header">
<div class="balloon-header-district-name">$[properties.test]</div>
<div class="toobject-link" id="district-link">Перейти<img src="/templates/sections/GeoMap/arrow-right.svg"></div>
</div>
<div class="balloon-content">
<div class="balloon-row">
<div class="label">Qweqw</div>
<div class="item">dfsdf</div>
</div>
<div class="balloon-row">
<div class="label">Dasdas</div>
<div class="item">dfsdf</div>
</div>
<div class="balloon-row">
<div class="label">Fdssds</div>
<div class="item">dfsdf</div>
</div>
<div class="balloon-row">
<div class="label">Erwersd</div>
<div class="item">dfsdf</div>
</div>
</div>
<div class="balloon-footer">
<div class="chevron-icon" id="chevron"><img src="/templates/sections/GeoMap/chevron-up.svg"></div>
<span class="balloon-footer-text">DFdfdffff</span><span class="balloon-footer-value">)</span>
</div>
<div class="balloon-collapsibe" id="collapsible">
<div class="balloon-row">
<div class="label">ASdfsdf</div>
<div class="item">dfsdf</div>
</div>
<div class="balloon-row">
<div class="label">Fdsfsd</div>
<div class="item">dfsdf</div>
</div>
<div class="balloon-row">
<div class="label">SDfrfrI</div>
<div class="item">dfsdf</div>
</div>
<div class="balloon-row">
<div class="label">Gsdfdfdf</div>
<div class="item">dfsdf</div>
</div>
<div class="balloon-row">
<div class="label">Fgdfgdfg</div>
<div class="item">dfsdf</div>
</div>
<div>
`)}
Вот здесь создаю балун:
let districtMark = new ymaps.Placemark(GeoMap.map.data[districtName].coord, {
iconContent: GeoMap.map.districtCollections[districtName].properties.info.name,
test: GeoMap.map.districtCollections[districtName].properties.info.name,
}, {
iconLayout: placemarkLayout,
iconContentLayout: placemarkContentLayout,
iconShape: {
type: 'Rectangle',
coordinates: [
[-25, -25], [25, 25]
]
},
iconOffset: [-40, -50],
balloonShadow: false,
balloonLayout: districtLayout,
balloonContentLayout: districtContentLayout,
balloonPanelMaxMapArea: 0,
hideIconOnBalloonOpen: true
})