Клуб API Карт

YandexML и BalloonStyle

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

Использую YandexML, но нужно темизировать балун. Есть ли способ подружить эти вещи?

Мой вариант(не работает):

 var styles = new YMaps.YMapsML("...");
   
    YMaps.Events.observe(styles, styles.Events.Fault, function (styles, error) {
        alert("При загрузке стилей произошла ошибка: " + error);
    });
   
    var s = new YMaps.Style();
    s.balloonContentStyle = new YMaps.BalloonContentStyle(new YMaps.Template("<div>Это тестовый баллуун!</div>"));                   
    s.balloonStyle = {template: new YMaps.LayoutTemplate(gballoonlayout)};
    YMaps.Styles.add("#parentIcon", s);
   
    var placemark = new YMaps.Placemark(MAP.getCenter(), {
        style : {
            parentStyle : "#parentIcon"
        }
    });
    MAP.addOverlay(placemark); // здесь работает

    function gballoonlayout(){
      ...
    };

   
    // ---------------------------------------------------------------------------------------------   
    // Загрузка объектов
   
    var ml = new YMaps.YMapsML('...');
Для объектов из XML не работает, показывает стандартный балун. Хотя родительский стиль прописан.
7 комментариев
Можете дать ссылку на ваш ymapsml-файл?
отправил на почту
ml.get(0).forEach(function (item) {
            control = ".objects-icons-block a." + item.metaDataProperty.AnyMetaData.iconAlias.toString();
           
            item.setStyle("#parentIcon"); // помогает для показа БАЛУНА


...
при загрузке объектов их xml
Можно установить стиль для всего ymapsml следующей строчкой:

ml.setStyle("#parentIcon");
Дело в том, что в YMapsML #parentIcon означает найти в этом документе элемент с id равным parentIcon, и при разборе в javascript он первращается в "урл документа"#parentIcon.

Переименуйте #parentIcon в "что-то"#parentIcon, например my#parentIcon. Тогда при ссылке из YMapsML стиль будет считаться внешним, а не будет добавлять урл документа.

Кроме того, для того чтобы присвоить метке стиль достаточно написать:
    var placemark = new YMaps.Placemark(MAP.getCenter(), {
        style : "#parentIcon"
    });
Вводить дополнительный уровень наследования излишне, конечно если у вас в стиле каждой метки не дописыватеся что-то еще.

Ну и на последок
     s.balloonContentStyle = new YMaps.BalloonContentStyle(new  YMaps.Template("Это тестовый баллуун!"));                    
    s.balloonStyle = {template: new YMaps.LayoutTemplate(gballoonlayout)};
вы используете две разные записи стилей одновременно. Можно переписать как:
     s.balloonContentStyle = {template: new  YMaps.Template("Это тестовый баллуун!")};                    
    s.balloonStyle = {template: new YMaps.LayoutTemplate(gballoonlayout)};
или наоборот записать через создание BalloonContentStyle и BalloonStyle. Так будет эстетичней :)
Спасибо