Клуб API Карт

Вопрос по cluster.refresh()

Пост в архиве.
igdev
7 мая 2013, 11:15

Проблем по коду нет, но вопрос один не покидает меня....

Есть метки, работаю с кластеризатором, соответственно часть меток в кластере отображаются, часть видна вне.... и вот такая ситуация наблюдается, допустим метка, которая сейчас не в кластере и видна сама по себе на карте, на кластер подвешен обработчик 'objectsaddtomap', выполняю:

PanTo на эту метку

обработчик 'objectsaddtomap' не вызывается, если карта показывает на местность недалеко от этой метки и обработчик вызывается, если карту перед PanTo мышкой сметить хорошенько, экрана на 3...

если в PanTo вешаю в callback cluster.refresh(), то обработчик 'objectsaddtomap' вызывается всегда...

Где-бы почитать поподробнее про cluster.refresh?

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

Зачем тебе рефрешить кластер?

Открывай балун метки и все.

Да, но тут такое дело, в callback PanTo ставлю

point.balloon.open()

и это работает только когда изначанльно точка видна на карте, но, если мышкой карту сдвинуть на 3-4 листа (экрана) то вылетает открытие балуна метки. А вот cluster.refresh вызывает  'objectsaddtomap' в нем стоит тот-же point.balloon.open() и работает всегда, поэтому я и задумался об этом refresh. Т.е. в коде я обошел проблему, но логику не совсем понял...

Вот пример http://igordev.ru/Devices/FishingMapTest.html

в нем кликни на Майские карьеры (сбоку от карты) - откроется. А если карту сдвинуть на 3-4 экрана и кликаем на ту-же метку - вылетет, а тут http://igordev.ru/Devices/FishingMapKBR.html все работает, но стоит cluster.refresh

Я же тебе давал пример в другом треде.

посмотри этот кусок кода, твой кейс попадает под первый if,

если у тебя там метка и у нее есть карта (getMap) открываешь балун,

если кластер, триггеришь клик на нем и вешаешь обработчик на objectsaddtomap

 

                    myMap.panTo(point.geometry.getCoordinates(), {                        callback: function () {                            var state = getState(point),                                cluster = state.cluster;                            if (state.isShown && (point.getMap() || (cluster && cluster.getMap()))) {                                openBalloon(point);                            } else {                                clusterer.events.once('objectsaddtomap', function () {                                    openBalloon(point);                                });                             }                        }                    });

 

Этот пример я уже много раз пересматривал... он не совсем корректный, так как в списке нет меток, которые не входят в кластер в данный момент времени чтоб щелкнуть не по кластеру а по метке, ну и сам пример вылетает с той-же ошибкой, как я и описываю.... воспроизвести ошибку просто:

1) Открываем пример (ничего не сдвигая и не масштабируя)

2) Снимаем галочку с "Отображение группы"

3) Сдвигаем карту мышкой, допустим вправо, экрана на 3-4 и более

4) щелкаем на первую-же строчку в списке

Начнет приближать-центрировать и потом вылетет, проверял и в IE и в Firefox

 

[13:22:26.277] TypeError: this._Oh.getMap(...) is null

Хм, и правда, Дим, посмотришь? Или подключи апи в дебаг-режиме я сама посмотрю.

да, пока не у компа, напишу тебе...

А зачем ты снимаешь галку "отображение группы"?

это удаляет метки из кластера и соответственно с карты, отсюда и ошибка.

 

Насчет "некорректности примера" это тоже не так.

вторая колонка "Добавлен в кластер" как раз отображает статус добовления метки в кластер в данный момент времени, тебе нужно кликать там где "false"

А почему тогда, если я убираю галочку и нажимаю на первую метку все отображается нормально, но именно сдвиг карты на ннн экранов дает ошибку? Во время сдвига ты-же ничего оттуда из кластера не убираешь, т.е. кластер заполнен и неизменен, но сдвиг на что-то влияет....

 

 

Я не нашел метки в списке, которая не отображается в кластере, т.е. отображается как метка сама по себе. Попробуй туда-же засунуть список таких меток, должно вылетать и при щелкнутой галочке....  когда сдвинешь карту.....

 

А почему тогда, если я убираю галочку и нажимаю на первую метку все отображается нормально, но именно сдвиг карты на ннн экранов дает ошибку? Во время сдвига ты-же ничего оттуда из кластера не убираешь, т.е. кластер заполнен и неизменен, но сдвиг на что-то влияет....

 

 

когда ты отжимаешь галку все метки этого цвета удаляются с карты. сам список не перестраивается, просто потому что я его не перестраиваю (забыл)


Я не нашел метки в списке, которая не отображается в кластере, т.е. отображается как метка сама по себе. Попробуй туда-же засунуть список таких меток, должно вылетать и при щелкнутой галочке....  когда сдвинешь карту.....

 

ты хочешь сказать что во второй колонке у тебя все значения true(зеленые)?

тогда нужно просто увеличить масштаб (приблизить)

 

Спасибо, разобрался как без cluster.refresh обойтись.... заново весь код переписал в соответствии с примером, проблема была в том, что isShown у меня практически всегда true а вот использование getMap() конечно в приведенном примере очень удивило, но в доке http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/Clusterer.xml

в 2 это отнюдь не однозначно понятно было...

Извиняюсь за такой прессинг, еще раз спасибо!

Да, там не все тривиально, асинхронность работы кластеризатора несколько все усложняет

Именно поэтому мы пример и написали, чтобы  еще и работать успевала =)

refresh стирает все объекты с карты, обнуляет параметры кластеризатора и заново все рассчитывает и рисует. Поэтому всегда после него вызывается objectsaddtomap.

Там еще что-то важное есть....

Сейчас просто поменял cluster.refresh() на

cluster.events.once('objectsaddtomap'.....

так он в callback не всегда заходит.

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

Я вам советую повнимательнее разобрать пример, который дает бабушка-бэтмен. Он уже через все эти стадии прошел, и лучше, чем кодом, там не скажешь)

ну так пример-то тоже вылетет.....