[英]How to set the initial index (position) for the CdkVirtualScrollViewport in Angular 7
我需要cdk-virtual-scroll-viewport
的初始位置不是列表的第一個元素/項目。
現在我找到了scrollToIndex
和scrollTo
方法,但我只能在ngAfterViewChecked
使用它時才能讓它們工作,這感覺ngAfterViewChecked
。
ngAfterViewChecked
使用這些方法是正確的做事方式嗎? @ViewChild(CdkVirtualScrollViewport) cdkVirtualScrollViewport: CdkVirtualScrollViewport; numbers: number[] = []; constructor() { for (let index = 0; index < 10000; index++) { this.numbers.push(index); } } ngAfterViewChecked() { this.cdkVirtualScrollViewport.scrollToIndex(2000); }
<ul class="list"> <cdk-virtual-scroll-viewport style="height:264px" itemSize="88"> <ng-container *cdkVirtualFor="let n of numbers"> <li style="height:88px">{{ n }}</li> </ng-container> </cdk-virtual-scroll-viewport> </ul>
我有同樣的問題,我有一個不太優雅的解決方案
contentCheck = 0
ngAfterViewChecked() {
if (this.contentCheck < 3) {
this. cdkVirtualScrollViewport.scrollToIndex(4000);
this.contentCheck++;
}
}
3 檢查后 scrollToIndex 工作。
雖然不是完美的解決方案,但您可以通過將 afterViewInit 與 setTimeout 結合來實現此行為:
ngAfterViewInit() {
setTimeout(() => {
this.cdkVirtualScrollViewport.scrollToIndex(50);
});
}
我們可以使用setRenderedRange
方法:
@ViewChild(CdkVirtualScrollViewport) virtualScroll: CdkVirtualScrollViewport;
ngAfterViewInit() {
const offset = 10; // that's an example
if (this.virtualScroll) {
setTimeout(() => {
const currentRange = this.virtualScroll.getRenderedRange();
this.virtualScroll.setRenderedRange({ start: currentRange.start + offset, end: currentRange.end + offset });
});
}
}
注意:我不確定它是否特定於我的用例,但僅通過設置預期范圍,似乎不會考慮前面的項目(我們無法向上滾動)。 使用scrollToIndex
似乎很重要,以便正確更新滾動。 這是我的解決方法,將范圍設置為減一,然后再滾動一:
const currentRange = this.virtualScroll.getRenderedRange();
this.virtualScroll.setRenderedRange({ start: currentRange.start + offset - 1, end: currentRange.end + offset - 1});
this. virtualScroll.scrollToIndex(offset);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.