Angular虚拟滚动显示问题
创始人
2024-10-30 10:31:02
0

在Angular中使用虚拟滚动时,有时候会遇到显示问题。这些问题通常是出现在滚动中的元素大小不一致的情况下。在此情况下,因为使用了虚拟滚动,所以只有少量的元素会被渲染。这样的话,它们的大小会影响渲染出来的元素的数量。

为了解决这个问题,我们可以对VirtualScrollStrategy进行扩展,在该扩展中,我们可以实现自己对ElementRef和ViewContainerRef的处理方式,从而确保元素会正确的被渲染出来。以下是一个示例:

import {CollectionViewer, DataSource, ListRange} from '@angular/cdk/collections';
import { BehaviorSubject, Observable, of } from 'rxjs';
import {catchError, finalize} from 'rxjs/operators';
import { ElementRef, Injectable, OnDestroy, ViewContainerRef } from '@angular/core';
import { CdkVirtualScrollViewport, VirtualScrollStrategy } from '@angular/cdk/scrolling';

@Injectable()
export class CustomVirtualScrollStrategy implements VirtualScrollStrategy, OnDestroy {
  private indexChange = new BehaviorSubject(0);
  private dataStream = new BehaviorSubject([]);
  private pooledPages = new Map();

  private viewRef: any;

  private snappedIndex = 0;

  constructor(private elementRef: ElementRef, private viewContainer: ViewContainerRef) {
    this.elementRef.nativeElement.style.overflow = 'auto';
  }

  ngOnDestroy(): void {}

  scrolled(index: number): void {
    const snappedIndex = this.getSnappedIndex(index);
    if (this.snappedIndex !== snappedIndex) {
        this.snappedIndex = snappedIndex;
        const maxIndex = this.viewRef.getDataLength() - 1;
        const start = Math.max(0, this.snappedIndex - 20);
        const end = Math.min(this.snappedIndex + 20, maxIndex);
        const pages = new Set();
        for (let i = start; i <= end; i++) {
            const pageIndex = Math.floor(i / this.viewRef.getPageSize());
            pages.add(pageIndex);
        }
        pages.forEach(page => this.fetchPage(page));
    }
  }

  attach(viewRef: any): void {
    this.viewRef = viewRef;
    this.viewContainer.createEmbeddedView(viewRef.templateRef);
  }

  detach(): void {
    this.viewContainer.clear();
    this.viewRef = null;
  }

  onDataLengthChanged(): void {
    this.indexChange.next(this.getAdjustedIndex(this.sn

相关内容

热门资讯

我来教教你!德州aa扑克平台!... 我来教教你!德州aa扑克平台!其实真的有挂((2021已更新))(哔哩哔哩);超受欢迎的aa扑克平台...
六分钟了解!wpk伙牌(透视)... 六分钟了解!wpk伙牌(透视)软件透明挂((2023已更新))(哔哩哔哩)1、快速入门:当你通过点击...
玩家必知教程!wpk外挂是真的... 玩家必知教程!wpk外挂是真的还是假的!的确是真的有挂((2020已更新))(哔哩哔哩);免费wpk...
5分钟实锤!wpk外挂是真的还... 5分钟实锤!wpk外挂是真的还是(辅助挂)软件透明挂((2024已更新))(哔哩哔哩)1、玩家可以在...
分享给玩家!德州之星辅助怎么用... 分享给玩家!德州之星辅助怎么用!原来是真的有挂((2025已更新))(哔哩哔哩);大神普及一款德州a...
2分钟实锤!智星德州辅助(辅助... 2分钟实锤!智星德州辅助(辅助挂)透视辅助((2023已更新))(哔哩哔哩)是一款可以让一直输的玩家...
今日科普!云扑克辅助软件!果真... 今日科普!云扑克辅助软件!果真是真的有挂((2023已更新))(哔哩哔哩);人气非常高,ai更新快且...
1分钟实锤!wpk微扑克辅助透... 1分钟实锤!wpk微扑克辅助透视(辅助挂)软件透明挂((2024已更新))(哔哩哔哩)1.微扑克辅助...
今日焦点!扑克时间辅助软件!的... 大家肯定在之前扑克时间或者扑克时间中玩过今日焦点!扑克时间辅助软件!的确是真的有挂((2023已更新...
十分钟普及!gg扑克发牌机制测... 十分钟普及!gg扑克发牌机制测试(透视)辅助透视((2022已更新))(哔哩哔哩);一、gg扑克AI...