Подтвердить что ты не робот

Реализовать бесконечный скроллер в angular2

Я хотел бы реализовать бесконечную прокрутку для * ng-для DIV в компоненте angular2. Для этого мне нужно как-то подключиться к событию onScroll окна через метод angular. Затем в angular я смогу загрузить больше элементов в массив элементов данных, когда пользователь прокрутил прохождение некоторой точки страницы.

У каждого есть идеи, как подключиться к событию window.scroll из angular (внутри компонента ng2)?

4b9b3361

Ответ 1

Используйте нотацию (target:event)="handler()" для прослушивания глобальных событий. Вы можете использовать window, document или body в качестве цели. Для вашего случая это будет (window:scroll)="onScroll($event)". См. эту панель.

import {Component} from 'angular2/core'

@Component({
  selector: 'my-app',
  template: `
    <div (window:scroll)="onScroll($event)">
      <h1>Hello Angular2</h1>
      ...
    </div>
  `,
})
export class App {

  onScroll(event) {
    console.log('scroll event', event);
  }
}

Ответ 2

Вы можете использовать @HostListener для обнаружения прокрутки. Вот как я это сделал

 export class AppComponent {

  @HostListener('window:scroll', ['$event'])
    onScroll($event: Event): void {
    console.log("On Scroll");
    //Logic To Check whether we are bottom of the page
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
      console.log("On Scroll Down");
      //Write logic here for loading new content.
    }
  }

}

Надеюсь, это поможет вам:)

Ответ 3

component.html

<div (scroll)="onScroll($event)">
    //Content
</div>

Теперь я просто использовал свойства $event.target scrollTopMax и scrollTop:

component.ts

onScroll(event: any): void {
   let elementHeight = event.target.scrollTopMax;
   let scrollPosition = event.target.scrollTop;
   if( elementHeight - scrollPosition < 100) {
       //add Content
   }
}

Конечно, вам понадобится проверка функции, если новый контент уже отображен. Если функция onScroll() не будет вызвана слишком часто.

В моем случае я вставляю другой компонент с *ngFor и создаем и @Output, чтобы уведомить родителя о готовом рендеринге.

child.component.ts

@Output()
rendered = new EventEmitter();

ngAfterViewChecked() {
    this.rendered.emit(<uniqueIdentifier>);
}

component.html

<div (scroll)="onScroll($event)">
    <child *ngFor="element in displayedElement"
        (rendered)="elementRendered($event)">
    </child>

component.ts

elements: any;
displayedElements: any[];
renderedElements: new Set();

addElements(): void {
    /////
}

elementRendered(<uniqueIdentifier>: any) {
    this.renderedElements.add(<uniqueIdentifier>);
}

onScroll(event: any): void {
    if( this.displayedElements.length == this.renderedElements.size) {
        let elementHeight = event.target.scrollTopMax;
        let scrollPosition = event.target.scrollTop;
        if( elementHeight - scrollPosition < 100) {
            this.addElements();
        }
    }
}