Одна из функций, которые предоставляет предстоящий выпуск OnsenUI, - это компонент ons-lazy-repeat. Часто нам нужно загрузить списки элементов, которые достаточно велики, чтобы замедлить работу приложения или даже заморозить его до завершения загрузки, что ухудшает взаимодействие с пользователем. Вот тут-то и пригодится новый ons-lazy-repeat.

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

Эта функция становится весьма удобной для многих случаев использования, таких как навигация по списку элементов с большим количеством изображений или анимаций. Давайте теперь посмотрим на пример приложения, использующего ons-lazy-repeat. Это приложение генерирует 10 миллионов (10 000 000) случайных элементов с изображениями и текстом:



Как использовать ленивый повтор

Нам нужен объект delegate, который будет содержать всю необходимую информацию для ons-lazy-repeat. Обратите внимание, что большинство функций получают параметр index, который содержит порядок элементов в списке. Вот наш delegate объект:

В деталях:

  • calculateItemHeight(index) должен возвращать высоту элемента, статическую, как в этом примере, или динамическую.
  • countItems() возвращает общую длину списка, который мы хотим отобразить.
  • destroyItemScope(index, childScope) - это необязательный метод, который будет запускаться каждый раз при выгрузке элемента, поэтому мы можем обрабатывать любые связанные функции.
  • configureItemScope(index, childScope) содержит информацию о самих элементах, которые могут быть динамически созданы или загружены из заранее заданного массива элементов:

В этом примере мы определяем каждый элемент как объект, содержащий четыре разных атрибута, и один из них, item.desc, будет асинхронно загружен из HTTP-запроса, когда ons-lazy-repeat сочтет нужным. В реальных приложениях вы обычно хотите предварительно получить кучу элементов, а не получать их по одному, но для простоты в этом примере мы просто делаем запрос для каждого элемента.

В HTML нам просто нужно добавить ons-lazy-repeat к нашим традиционным тегам, таким как <ons-list-item>, указав ранее созданный delegate:

Помните, что объект MyDelegate должен быть прикреплен к области того же контроллера, в котором находится элемент <ons-list-item>. Также обратите внимание, что это общий атрибут, что означает, что он не ограничен <ons-list>, но работает с любым тегом, в котором мы может определить высоту элементов, например тегов <div>.

Это все о новой ons-lazy-repeat функции, вы наверняка найдете оригинальные способы ее использования. Вы можете проверить код этого проекта на Github и оставить свой вопрос или отзыв в комментариях. Следите за обновлениями!

Первоначально опубликовано на сайте onsen.io 15 февраля 2015 г.