Клуб API Карт

Не получается повесить событие на элемент списка control.ListBox

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

Если назначать события непосредственно:

 

AreaList.get(0).events.add('click', function () {

    console.log(0)

});

AreaList.get(1).events.add('click', function () {

    console.log(1)

});

 

все работает, однако если я эти события пытаюсь повесить через цикл, то не работает. Выдает ошибку TypeError: this._yH is undefined.

Ссылка: https://jsfiddle.net/r7yc2rdm/5/

P.S. Рабочий вариант закоментирован

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

Лучше использовать делегирование событий (один слушатель на списке), чтобы не плодить функции.

 

Лучше не использовать for in для итерации по массивам, метод get ожидает число, а передается строка '0' !== 0

Я использую объекты а не массивы. 

Попробывал передать в get число, но при событии возвращается одно и то же: https://jsfiddle.net/r7yc2rdm/7/

А не подскажите поподробнее про делегирование событий в картах? Спасибо.

 

Я использую объекты а не массивы. 

Неправда, data у вас указывает на массив

for (var key in data)

 

 

Попробывал передать в get число, но при событии возвращается одно и то же

На момент срабатывания события (выбора элемента списка) цикл for in очевидно уже закончит свою работу и переменная key будет равна data.length - 1. Это особенность языка Javascript. Могу порекомендовать хорошую книжку

 

 

А не подскажите поподробнее про делегирование событий?

https://learn.javascript.ru/event-delegation

Неправда, data у вас указывает на массив

Ну как же...

http://joxi.ru/V2VK4MMfzZqwAv

Массив объектов

console.log(Array.isArray(data)); // true

 

все-таки рекомендую прочитать книжку

спасибо

а каким образом мне делегировать события у control.ListBoxItem. Как мне к ним обратиться, по каким id и пр.?

текущий элемент списка, на котором произошло событие, можно получить из объекта события

e.get('target')

Будет ли уместен вот такой вариант: https://jsfiddle.net/r7yc2rdm/8/ ?

Как-то коряво с этим поиском индекса item-ов

Лучше добавить поле centroid каждому item-у и потом забирать его непосредственно из того по которому был клик

https://jsfiddle.net/r7yc2rdm/9/

Действительно, так кошернее. Огромное спасибо)

P.S. Книжечку обязательно почитаю, как время будет.