Клуб API Карт

Баг в 2.1 в control.ListBox

khoden87
3 мая 2014, 07:06

Столкнулся, когда пытался переехать с 2.0 на 2.1

Баг заглючается в том, что нельзя добавлять ListBoxItem в ListBox после создания.

Возможно они просто не рендерятся. 

Точнее, если сразу добавить, то все ОК. Но если чуть погодя, то не получается (а у меня они загружаются ajax-запросом)

 

Проще всего продемонстрировать примером из песочницы:

Исходник: http://api.yandex.ru/maps/jsbox/2.1/list_box_layout

Модифицированная версия: http://jsbin.com/hawip/1/edit?js,output (изменения сразу после инстанцирования listBox)

        // Пытаюсь добавить пункты отложено
        setTimeout(function(){
          listBox.add(listBoxItems[0]);
          listBox.add(listBoxItems[1]); 
        }, 100); 

 

5 комментариев
Подписаться на комментарии к посту

В документации на 2.1 я не вижу у листбокса метода add

Хм, даже так. 

Метод присутствует, в документации не описан. Возможно пережиток с прошлого апи.

Если просто вызвать (без setTimeout)

listBox.add(listBoxItems[0]);
listBox.add(listBoxItems[1]); 

то все нормально.

 

Вы можете предложить альтернативу? Кроме как вручную в DOM добавлять деток и следить за их актуальностью. Дириктива for в шаблонизаторе? В какой момент тогда её обновлять? Ведь теперь даже события на добавление нет.

 

P.S. Было бы неплохо для разработчиков API предупреждать об поломанной обратной совместимости с 2.0. 

В 2.1 нет обратной совместимости с 2.0

Передам про add разработчикам после праздников

Спасибо за сообщение!
add / remove случайно пропали из документации, в этом месте обратная совместимость не ломалась.
С асинхронным добавлением (точнее даже с добавлением пунктов после добавления контрола на карту) — это действительно баг, поправим в ближайшей версии.

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

setTimeout(function () {
    listBox.add(listBoxItems[0]);
    myMap.controls
        .remove(listBox)
        .add(listBox);
}, 100);

спасибо!