отложенная загрузка angular2 или разбивка на страницы при прокрутке

#angular #lazy-loading

#angular #отложенная загрузка

Вопрос:

Как создать настоящую отложенную загрузку? Проблема в следующем: я должен создать отложенную загрузку при прокрутке. Я использую бесконечную прокрутку при событии прокрутки, и я получаю следующую страницу и сопоставляю с массивом на странице 1. Но я думаю, что это не так, потому что я увеличиваю массив. Помогите, пожалуйста, как создать отложенную загрузку без увеличения массива?

 onScroll() {
    var inOrOut = this.selectedType.inOrOut == 'incoming' ? 1 : 0;
    if(this.selectedType.page.page !== false) {
        this.selectedType.page.page = this.selectedType.page.page   1;
        this.getMessagesForPage();
    }
}

getMessagesForPage() {
    var self = this;

    this.messageSmsService
        .getMessagesForPage(this.page)
        .subscribe(
            result => {
                self.allData[ self.selectedType.type].push(result);
            },
            error => {...})
}
  

Ответ №1:

Есть virtual-scroll . Это не прокрутка браузера (Windows). Фундаментальное отличие заключается в переписывании html по запросу. Обычно прокрутка рисует весь html, а виртуальная -видимую часть прокрутки.

Добавить в шаблон.

  <virtual-scroller 
            [items]="buffer"
            (vsUpdate)="scrollItems = $event"
            (vsEnd)="getMessagesForPage($event)">

            <div *ngFor="let item of scrollItems"> </div>

 </virtual-scroller>
  

vsEnd — это событие, когда мы достигаем «underwold».

и getMessagesForPage было изменено так.

 public getMessagesForPage(event: ChangeEvent) {
  if (event.end !== this.buffer.length-1) return;

  this.getData(this.buffer.length, 10)
      .subscribe(
         result => this.buffer = this.buffer.concat(result)
       )
    }
  

Я добавляю в буфер элементы, но я не рисую весь html в прокрутку