[英]cdk-virtual-scroll-viewport with variable item heights
我想在具有不同高度的项目的时间线视图中使用cdk-virtual-scroll-viewport
。
因此,根据文档,设置itemSize="x"
指的是列表中项目的大小(以像素为单位) ,是不切实际的。
autosize
尚不可用。
是否可以使用带有可变项目大小cdk-virtual-scroll-viewport
虚拟/无限滚动?
更新
我一直在寻找替代的虚拟/无限滚动解决方案,我几乎不敢相信,似乎没有适用于动态行高的解决方案,即使使用https://github.com/rintoj/ngx-virtual-scroller也不推荐.
2019 年 7 月更新 2
由于同时仍然没有解决方案,我相信解决此问题的“足够好”的方法是加载固定数量的项目,并在列表底部添加一个按钮以加载更多项目,如下例所示: https://stackblitz.com/edit/ang-mat-load-more
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%">
在 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();
}
}
itemSize="x" 并不能帮助设置高度......你必须使用 CSS 自己分配一个任意的高度。
可以使用 [ngStyle] 动态设置 cdkvirtualscrollviewport 高度
<cdk-virtual-scroll-viewport
itemSize="parent?.children.length"
[ngStyle]="{'height.px': parent?.children.length<10? parent?.children.length*42 :250 }"
>
这个 CSS 对我有用。 无需固定高度:
<cdk-virtual-scroll-viewport class="viewport">
.......
</cdk-virtual-scroll-viewport>
.viewport {
display: contents;
}
最后我找到了解决方案:就我而言,我最近使用的是 @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>
它对我有用。
唯一对我有用的是 stackblitz 的splaktar 示例
模板:
<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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.