Angular 7 - Virtual Scroll
Tutorial para hacer un scroll virtual en Angular 7, la nueva característica, y es que Angular está pegando fuerte, y ha venido para quedarse. Ver demo.
Para descargar el código fuente, código github.
- 1. prerrequisitos
 - 2. Importa módulo
 - 3. Obtención de datos de una web (Opcional)
 - 4. Virtual scroll
 - 5. Jugando con sus índices
 
1. prerrequisitos
Antes de nada, para poder usar virtual scroll debemos instalar la librería cdk de angular
$ npm install @angular/cdk --save
Crea un componente e inclúyelo en la ruta.
$ ng g c pages/virtualScroll
2. Importa módulo
Incorpora el módulo scroll
src/app/app.module.ts
import { ScrollingModule } from '@angular/cdk/scrolling';
...
  imports: [
    ...
    ScrollingModule
  ],
3. Obtención de datos de una web (Opcional)
Para este ejemplo vamos a conseguir todos los emojis que dispone unicode, a través de una web.
la web en cuestion es: https://unicode.org/ Como se ve es una tabla, con sus tr y sus td.
Para obtenerlo y transformarlo en array sería de esta forma:
copy([...document.querySelectorAll('tbody tr td.chars')].map((data)=>{return data.innerText }))
- copy: es un comando de chrome que copia al portapapeles. Si pulsas control-v en donde quieras pegarás el contenido.
 - querySelectorAll: obtenemos todos los datos, pero ojo, no es array, es dom
 - …[]: transforma el dom en array
 
En este caso lo he guardado en: src/app/data/emoji.json
4. Virtual scroll
<div *ngIf="emojiList">
  <cdk-virtual-scroll-viewport itemSize="80" class="">
    <div class="" *cdkVirtualFor="let emoji of emojiList; let i=index; let cuenta=count">
       - <span class="emoji"></span>
    </div>
  </cdk-virtual-scroll-viewport>
</div>
- itemSize: es el tamaño del item. Debe concordar con el tamaño real, ya que si no dará saltos raros.
 
5. Jugando con sus índices
Con un viewChild podemos acceder a un index específico:
src/app/pages/virtual-scroll/virtual-scroll.component.ts
  ...
  @ViewChild(CdkVirtualScrollViewport) viewport: CdkVirtualScrollViewport;
  ...
  irInicio() {
    this.viewport.scrollToIndex(0);
  }
  irFinal() {
    this.viewport.scrollToIndex(this.emojiList.length);
  }
src/app/pages/virtual-scroll/virtual-scroll.component.html
  <button (click)="irInicio()" class="btn btn-primary">Ir inicio</button>
  <button (click)="irFinal()" class="btn btn-primary ">Ir final</button>
escríbe algo en comentarios 😉 Gracias.