Доброго времени суток.
Я чесна не вдупляю откуда лаги, вот обьясните, может алгоритм кривой или что то не учел (все еще бесконечный скроллинг)
Кода много, поэтому опишу архитектуру
Сервер отдает обьявления заданным числом по запросу. Висит бесконечный скроллинг ionic фреймоврка, и когда доскроливаем до конца делается запрос.
2 директивы
1) watch-ем следит за изменением длинны массива jsono-в обьявлений, каждый раз при срабатывании (пришли данные с сервера) из полученного генерируется html шаблон, компилится ангуляром,вставляется в dom, узнаем его высоту и даем абсолютную позицию и display none. Устанавливаем ему top относительно предыдущего обьявления (высота + позиция).
Все, эта директива срабатывает только 1 раз при загрузке обяьвлений и особо не грузит.
На выходе из нее получаем два массива в контроллере
1) Все вставленные обьявления (дом элементы)
2) и массив с координатами низа и верха обьявлений
ЗЫ
тоесть, все обьявления парсятся, добавляются в дом скрытыми, а потом мы уже оперируем только с массивами ссылок на эти элементы и их позициями (которые фиксированы и скрытые элементы лежат там где нужно)
2) директива уже вызывается с завидным постоянством
requestanimationframe, следим за скроллингом, если был скролл то вызываем функцию, которой отдаем верхнюю и нижнюю точку экрана. боунд клиент ректом
В этой функции мы перебираем массив (его вернула 1 директива) с элементами и проверяем какой из них попадает в зону видимости
for advertId of buffer
if (top - bufferZone) <= marginBottom[advertId] <= (bottom + bufferZone) or
(top - bufferZone) <= marginTop[advertId] <= (bottom + bufferZone)
visible.push advertId
Отслеживаю верхнюю и нижнюю часть обьявлений попадающих под видимость экрана и буферную зону (чтобы обьявления успевали гененрироваться)
Кстати, чтобы не ловить лагов при переборе огромного кол-ва элементов в массиве dom-элементов, я слайсом копирую часть огромного массива, где находится пользователь +- один элемент, в общем перебор ведется не по 200 элементному а по 6.
Все видимые айдишники элементов добавляются в массив visible, и запускается функция, которая перебирает этот массив (обычно 2 - 3 элемента) и дает им всем (получае доступ по ид из главного большого массива) display inline.
Так же есть массив oldVisible, он хранит айдишники элементов, которые передавались функции в прошлый раз. И нужен для того, чтобы скрывать старые обьявлений в этой же функции, а потом определять положение пользователя в большом массиве элементов.
зы
я конечно могу замутить оптимизацию, чтобы скроллинг угадывал куда собирается скроллить пользователь. Это не сложно, но не думаю что сильно изменится производительнсоть
зы зы
Спааасииити погибаю! 2 недели пилю эту хрень уже столько способов перепробовал.
Находил вот это
http://habrahabr.ru/post/204350/
Но у него работает всего лишь на 400 сотнях, текстовых нод
А мне нужно хотя бы на 400 обьявлений с слайдерами (которые автоматом крутятся иногда) и текстом (а лагает и без слайдеров) Да еще и на телефонах