cdk-virtual-scroll-viewport с переменной высотой элемента
Я хотел бы использовать cdk-virtual-scroll-viewport
в представлении временной шкалы с элементами разной высоты.
Итак, постановка itemSize="x"
который, согласно документации, относится к размеру элементов в списке (в пикселях), нецелесообразен.
autosize
еще не доступен
Можно ли вообще использовать виртуальную / бесконечную прокрутку с cdk-virtual-scroll-viewport
с переменными размерами элементов?
7 ответов
авторазмер работает для меня.
Попробуйте установить:
"@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%">
Наконец, я нашел решение: в моем случае я недавно использовал @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>
это сработало для меня.
Пока эта функция не будет предложена в 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, чтобы назначить произвольную высоту самостоятельно.
Что касается вашего вопроса, переменные размеры элементов не должны быть проблемой с виртуальной прокруткой... вы можете изменить массив в этом примере, чтобы увидеть возможность и результаты очень быстро.
Этот CSS мне подходит. Не требуется фиксированной высоты:
<cdk-virtual-scroll-viewport class="viewport">
.......
</cdk-virtual-scroll-viewport>
.viewport {
display: contents;
}
Единственное, что у меня сработало, это пример 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;
}
Можно динамически установить высоту cdkvirtualscrollviewport с помощью [ngStyle]
<cdk-virtual-scroll-viewport
itemSize="parent?.children.length"
[ngStyle]="{'height.px': parent?.children.length<10? parent?.children.length*42 :250 }"
>