Angular Material Scroll加载了比预期更多的项目

时间:2019-04-11 14:08:16

标签: angular angular-material virtualscroll angular-cdk-virtual-scroll

我正在尝试通过虚拟滚动组件加载20个项目,但在页面加载后我立即看到34个,根本没有进行任何滚动。我的CSS错误吗?还是我忘记了控件上的某些设置?该项目位于here

2 个答案:

答案 0 :(得分:0)

一个想法是仅加载几个项目,并使用观察者加载下一批项目

<cdk-virtual-scroll-viewport 
     itemSize="10" 
     minBufferPx="1200" 
     maxBufferPx="1200" 
     (scrolledIndexChange)="getNextBatch($event)">
  ...
</cdk-virtual-scroll-viewport>
import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core';
import { ImageService } from '../image.service';
import { Subscription } from 'rxjs';
import { Router } from '@angular/router';
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';

@Component({
  selector: 'app-gallery',
  templateUrl: './gallery.component.html',
  styleUrls: ['./gallery.component.css'],
})
export class GalleryComponent implements OnInit, OnDestroy {
  @ViewChild(CdkVirtualScrollViewport) viewport: CdkVirtualScrollViewport;

  constructor(public service: ImageService, private router: Router) {}

  ...

  getNextBatch(e) {
     const end = this.viewport.getRenderedRange().end;
     const total = this.viewport.getDataLength();

     console.log(end)
     console.log(total)

     if (end === total) {
        console.log('request next batch');
     }
  }
}

答案 1 :(得分:0)

This tutorial on Firebase说:

  

让我们首先通过虚拟滚动回顾一些重要的概念。首先,您声明cdk-virtual-scroll-viewport组件以提供用于虚拟滚动的上下文。它应具有 itemSize 输入属性,该属性定义为每个项目的像素高度

您可以看到,这并不是专门为网格滚动视图而设计的,但是我们可以解决此限制:

您有5列图像,每个图像高160像素,顶部和底部每10个像素的边距,产生180像素。

现在,我们计算180除以5得到36。这就是您需要的itemSize

<cdk-virtual-scroll-viewport itemSize="36">
  <div class="image" *cdkVirtualFor="let image of images">
    <a (click)="viewDetail(image)">
      <img src="https://picsum.photos/200/160/?image={{ image.id }}" />
    </a>
  </div>
</cdk-virtual-scroll-viewport>

请参见this fork of your StackBlitz

官方文档在这里:Angular | Scrolling

您也可以更改缓冲区大小

<cdk-virtual-scroll-viewport itemSize="36" minBufferPx="540" maxBufferPx="540">
  <!-- ... -->
</cdk-virtual-scroll-viewport>

请参阅: Angular | Scrolling # Scrolling over fixed size items

您还可以让Angular进行数学运算:

<cdk-virtual-scroll-viewport itemSize="{{ 180 / 5 }}" minBufferPx="{{ 180 * 3 }}" maxBufferPx="{{ 180 * 3 * 3 }}">

这意味着您将提前加载三页(每页3行),如果仅剩一个页面缓冲区(每页3行图像),则会加载更多