Клуб API Карт

RemoteObjectManager, LoadingObjectManager - остановить и очистить, события загрузки данных

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

 

Приветствую.

 

Вопрос 1

Стоит задача при смене зумов на карте показывать разные объекты со своими видами меток и тд. Для увеличения производительности и плавного показа меток при смене рабочей области используется RemoteObjectManager, не получается очищать и останавливать. 

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


upd:

Нашел только вот такой способ очистить и остановить RemoteObjectManager

// очищаем коллекцию

remoteObjManagerCity.objects.removeAll();

// удаляем саму коллекцию 

map.geoObjects.remove(remoteObjManagerCity); 



 

Вопрос 2

Почему не работает указания preset при создании объекта?

 

ymaps.ready(init);

function init () {

    var myMap = new ymaps.Map('map', {center: [55.76, 37.64], zoom: 10 }),

        objectManager = new ymaps.ObjectManager({ ... },

        {

           // не работает

            preset : 'islands#greenDotIcon'    

        });


    // Работает

    //objectManager.objects.options.set('preset', 'islands#greenDotIcon');

}

 

Вопрос 3

RemoteObjectManager, RemoteObjectManager,  делает запросы при измении зума и видимой области, почему нет событий начала загрузки и окончания загрузки данных,

если медленные запросы то нужно показывать загрузку в виде "ajax loader" 



Спасибо


 

8 комментариев
Sergey Konstantinov
27 января 2016, 23:17
По поводу вопрос №3 — по нашему опыту, это плохая практика. На экране одновременно может быть видно 30-50 тайлов, и ситуация, когда один или несколько из 50 тайлов не прогрузились / долго грузятся — случается довольно часто, особенно на мобильных. Отсутствие одного тайла пользоваться картой мешает не сильно, а вот бесконечный спиннер по центру — ещё как.

Речь не о тайлах карты, а о данных, скорость интернета может быть разная и скорость загрузки самих данных тоже. События нужны для показа индикатора загрузки данных. Ситуация когда при смене видимой области/зума пару сек нечего нет, не совсем устаивает, нужно показывать пользователю что идет работа.    

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

Пока что можно реагировать на события коллекций объектов add и remove. Например, показывать индикатор при смене зума карты и убирать при первом событии add на коллекции объектов.

mari-na-bzzz,
Можно ещё следить за количеством объектов через определённое количество времени, например, вот так:


/**
* Скрываем лоадер, если количество объектов поменялось
*/
var objectsCount = 0;
setInterval(function() {
    var currentObjectsCount = remoteObjectManager.objects.getLength();
    if (currentObjectsCount !== objectsCount) {
        objectsCount = currentObjectsCount;
        hideLoader();
}
}, 500);

Вопрос 1.

Да, сейчас нужно удалять менеджер с карты (можно предварительно не чистить коллекцию). Метод для обновления данных появится в одном из будущих релизов.

 

Вопрос 2.

Пресет можно задать на коллекцию объектов

objectManager.objects.options.set('preset', 'islands#redIcon');

Спасибо за ответ, теперь все более понятно :)

По поводу третьего пункта.
Пока ждем доработок в api, попробуй использовать такой код:
https://gist.github.com/zobzn/8f337012b76f65c23a4d
Вкратце - наследуем свой CustomRemoteObjectManager от RemoteObjectManager, и добавляем поддержку событий dataloadbefore и dataloadafter.
ZOBZN,
Отличная идея но RemoteObjectManager не добавляет маркеры с тем же LoadingObjectManager