如何在Angular 7中设置CdkVirtualScrollViewport的初始索引(位置)

时间:2018-11-12 19:52:47

标签: angular lifecycle angular7 angular-cdk virtualscroll

我需要cdk-virtual-scroll-viewport的初始位置不是列表的第一个元素/项目。

现在,我找到了scrollToIndexscrollTo方法,但是只有在ngAfterViewChecked中使用它们时,我才能让它们正常工作。

  1. 有人可以确认在ngAfterViewChecked中使用这些方法是正确的处理方式吗?
  2. 如果不是,请显示替代方法/技术?

  @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>

3 个答案:

答案 0 :(得分:0)

我有同样的问题,我的解决方案不太好

contentCheck = 0

ngAfterViewChecked() {
  if (this.contentCheck < 3) {
  this. cdkVirtualScrollViewport.scrollToIndex(4000);
  this.contentCheck++;
 }
}

3次检查后,scrollToIndex起作用。

答案 1 :(得分:0)

虽然不是完美的解决方案,但您可以通过将afterViewInit与setTimeout结合使用来实现此行为:

ngAfterViewInit() {
    setTimeout(() => {
        this.cdkVirtualScrollViewport.scrollToIndex(50);
    });
}

答案 2 :(得分:0)

我们可以使用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);