可变高度的cdk-virtual-scroll-viewport

21

我想在时间轴视图中使用 cdk-virtual-scroll-viewport 来显示高度不同的项目。

因此,设置 itemSize="x",根据文档引用的是列表中项目的大小(以像素为单位),是不可行的。

autosize 目前还不可用。

是否可能使用具有可变项目大小的 cdk-virtual-scroll-viewport 进行虚拟/无尽滚动呢?

更新

我正在寻找替代的虚拟/无尽滚动解决方案,很难相信,似乎没有一种解决方案可以处理动态行高,即使使用https://github.com/rintoj/ngx-virtual-scroller也不建议这样做。

更新2,2019年7月

由于目前仍然没有解决方案,我认为"足够好"的解决方式是加载固定数量的项目,并在列表底部添加一个按钮来加载更多项目,就像这个例子: https://stackblitz.com/edit/ang-mat-load-more


正在开发中。请参见 https://github.com/angular/components/issues/10113 - ronenmiller
1
请看这里 - https://stackblitz.com/edit/cdk-virtual-scroll-simple-autosize - Shrinivas
7个回答

11

autosize 适合我。

尝试安装:

"@angular/cdk": "6.2.0",
"@angular/cdk-experimental": "6.2.0"

然后将 ScrollingModule 导入到您的模块中:

import {ScrollingModule} from "@angular/cdk-experimental";

imports: [ScrollingModule]

然后你可以像下面这样使用autosize属性:

 <cdk-virtual-scroll-viewport autosize style="height: 100%">

2
我认为你需要导入稳定版和实验版模块:import { ScrollingModule as ExperimentalScrollingModule } from '@angular/cdk-experimental/scrolling'; import { ScrollingModule } from '@angular/cdk/scrolling';imports: [ScrollingModule, ExperimentalScrollingModule] - Preda7or
1
"@angular/cdk": "12.2.8", "@angular/cdk-experimental": "12.2.8"如果我只设置了autosize,就会出现错误 错误:cdk-virtual-scroll-viewport需要设置“itemSize”属性。 - Juri
@Juri,你找到解决方案了吗? - Maurice
@Maurice 我猜我的模块配置有问题,在共享模块中添加了这两个模块,现在似乎已经可以工作了。谢谢你的询问。 - Juri
我遇到了这个错误:“多个组件匹配节点,标记为cdk-virtual-scroll-viewport。”我正在使用@angular/cdk:“12.2.13,@angular/cdk-experimental:6.4.7。我应该将两个版本匹配吗? - Agung Sudrajat
1
非常感谢您的回答,它对我很有帮助...奇怪的是,在"@angular/cdk": "^15.2.0"中我们仍然没有这种行为。 - Denis Kotov

3

最终,我找到了解决方案:

在我的情况中,我最近使用了@angular/cdk版本12.2.13,所以你也应该安装@angular/cdk-experimental,版本为12.2.13(相同版本)。

前往app.module.ts文件: 添加以下代码:

import { ScrollingModule as ExperimentalScrollingModule } from '@angular/cdk-experimental/scrolling';
import { ScrollingModule } from '@angular/cdk/scrolling';

在导入中:

[ScrollingModule,
    ExperimentalScrollingModule]

那么请执行以下操作:
<cdk-virtual-scroll-viewport
          autosize
          style="height: 100%"
          class="container"
        >
your content
</cdk-virtual-scroll-viewport>

它对我有效。


2

在CDK中还没有提供此功能,所以我通过监听本地元素的onscroll事件来解决它,然后在滚动偏移量到底部为0时进行响应。

@ViewChild(CdkVirtualScrollViewport, { static: false })
public virtualScrollViewport?: CdkVirtualScrollViewport;

...

ngAfterViewInit() {
  this.virtualScrollViewport.elementRef.nativeElement.onscroll = (e) => { this.onScroll(e) };
}

onScroll(e) {
  var scrollOffset = this.virtualScrollViewport.measureScrollOffset("bottom");

  if (scrollOffset == 0) {
    this.fetchMoreData();
  }
}

请问这如何解决项高度的问题?虚拟滚动的重点是仅在视口中显示项目时才呈现它们,因此要能够计算,需要一个固定的项高度。您提出的解决方案似乎是关于加载下一个项目,而不是解决可变高度问题。 - dormant
1
动态高度或者在我这种情况下,可扩展的行存在一个问题,就是滚动有时会提前加载项目或者根本不加载,因为触发点不一致。这个解决方法将提供更可靠的体验,以便在何时加载下一批项目,使用户永远不会卡在可滚动区域的底部。但是,它并没有解决仅呈现可见项目的问题。 - Richard Medeiros

0

对我有效的唯一方法是使用 splaktar 在 stackblitz 上的示例。

模板:

<cdk-virtual-scroll-viewport [itemSize]="itemSize" class="example- 
viewport">
<div *cdkVirtualFor="let item of items"
   [style.height]="itemSize + 'px'">{{item}}</div>
</cdk-virtual-scroll-viewport>
<br>
<div>
<label for="height">Item Size:</label>
<input id="height" type="number" [(ngModel)]="itemSize">
</div>

组件:

import {ChangeDetectionStrategy, Component} from '@angular/core';

@Component({
selector: 'cdk-virtual-scroll-overview-example',
styleUrls: ['cdk-virtual-scroll-overview-example.css'],
templateUrl: 'cdk-virtual-scroll-overview-example.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CdkVirtualScrollOverviewExample {
items = Array.from({length: 100000}).map((_, i) => `Item #${i}`);
itemSize = 80;
}

0

0

这个CSS对我有效。不需要固定高度:

<cdk-virtual-scroll-viewport class="viewport">  
   .......
</cdk-virtual-scroll-viewport>

.viewport { 
   display: contents;
}

1
欢迎来到 Stack Overflow。在您将此内容粘贴到更多位置之前,请花些时间阅读 是否可以在多个问题中添加重复答案? - fcdt

-1

使用[ngStyle]动态设置cdkvirtualscrollviewport的高度是可行的。

          <cdk-virtual-scroll-viewport
        itemSize="parent?.children.length"
        [ngStyle]="{'height.px': parent?.children.length<10? parent?.children.length*42 :250 }"
      >

你能再解释一下吗?parent是什么?确切地说,height.px又是什么? - Maurice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接