Клуб API Карт

непонятная ошибка this.__destructListener is null

Artemenko
22 января 2010, 11:13

Столкнулся с такой проблемой, вроде все делаю правильно:

1) При выборе чекбокса нужной группы, создаю группу GeoCollectionBounds

2) подгружаю из БД метки,

3) назначаю слушателей на открытие/закрытие баллуна, YMaps.Events.observe()

4) формирую ссылки на метки

5) добавляю метки в группу.

6) Отображаю группу на карте map.addOverlay(group);


Все ок, но вот когда я снимаю чекбокс группа должна удалится, но ЧЕРЕЗ РАЗ (то есть некоторые скрываются а некоторые выдают ошибку) map.removeOverlay(group);

НО появляется непонятная ошибка в консоли "this.__destructListener is null"


Ошибку можно пронаблюдать по адресу: http://www.anapa.info/map/


Что я делаю не так?


P.S. Использую JQuery 1.4 подключенный отдельно...

P.P.S. Так и не понял как добавить группу (именно группу а не набор меток) в диспетчер объектов. Если такой возможности нет, появится ли она в будующем или есть некая другая схема выполнения данного ритуала? Спасибо.


9 комментариев
Подписаться на комментарии к посту
По началу было подумал, что проблема в некоректном использовании мною YMaps.Events.observe() - пробовал закомментировать - непомогло, бубуен подсказал что проблема происходит в ядре карт в методе addToMap но мне это ни как не помогло решить мою проблему =)
У вас не определен класс SimpleOverlay. Пример из документации показывает как можно создать собственный объект-оверлей. В вашем случае проще использовать стандартные оверлеи - метки.

Пример создания меню по группам объектов также можно найти в Руководстве разработчика:
http://api.yandex.ru/maps/jsapi/doc/dg/tasks/map-overlays-examples.xml#how-to-control-groups-from-menu

Сейчас у вас ошибка "$.log is not a function".
 
Сейчас у вас ошибка "$.log is not a function".

проблему с лог убрал $.log - этот мини-метод был в библиотеке пдоключаемой при админ-режиме, закоментировал эти строки.

У вас не определен класс SimpleOverlay
Я его специально не определял, точнее сначала он был, а потом я его убрал, и переделал соответственно код.

По идее я просто создаю группу, добавляю в нее метки и передаю ее в map.addOverlay(group);
И убираю ее через map.removeOverlay(group);
В этом ведь случае не должно быть ошибки? А она появляется...

Вообщем сейчас я переделал код - посмотрите еще раз пожалуйста (желательно с включенным firebug-ом)
Могу предположить, что Вы удаляете группу с карты дважды. Попробуйте поставить проверку, не удалена ли уже эта группа.
Нет, группа удаляется один раз - это четко, да и в любом случае это должен проверять YMaps ИМХО. И если такая группа уже была удалена, просто нечего не делать...
Вообщем то как и в случае с моей основной ошибкой "this.__destructListener is null" Разве не нужно проверять наличие __destructListener перед его вызовом? Дело не только во мне - я то переделаю не вопрос хоть на тот же "собственный объект-оверлей" просто чтоб другие с подобным не сталкнулись...
Вы добавляете один и тот же объект (Placemark) в две группы OverlayGroup. При удалении групп с карты появляется эта ошибка. Решение состоит в том, чтобы либо не добавлять один объект в две группы, либо создавать каждый раз копию.
Вот это уже похоже на правду, спасибо - подумаю. Странно что такая схема выдает ошибку.
Неужели разработчики не учли то что один и тотже объект можно добавить в разные группы.
Я всегда считал, что в группу передается ссылка на объект.

Была такая же ошибка при  map.addOverlay( a:YMaps.Placemark)


map.removeOverlay( a:YMaps.Placemark)


то бишь  this.__destructListener is null в firefox + не полностью добавлялось-удалялось


 


Этот пост помог.


 


Решение: при добавлении/удалении объектов карты нужно проверять что не делаешь это дважды.


 


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


Гипотеза: возможно этой ошибки не будет если использовать вместо removeOverlay   removeAllOverlays().


 


Однако естественней показывать-скрывать только новые cлои..