添加新项目时,在列表中保持滚动位置

Gau*_*jee 9 angular

我有一个我正在使用的项目列表 *ngFor

<div id="container">
  <div 
      [class.selected]="selectedItem.id == item.id"
      #container 
      *ngFor="let item of items; indexBy: byId">{{item.name}}</div>
</div>
Run Code Online (Sandbox Code Playgroud)

我会定期更新列表数组.

this.listService.index((items) => this.items = items)
Run Code Online (Sandbox Code Playgroud)

我有一个selectedItem用于突出选择项目.

当我更新列表时,可以在所选项目(大部分)上方和所选项目下方添加新项目.当发生这种情况时,所选项目将远离当前视图位置.我想调整父div的scrollOffset是这样一种方式,列表中项目的位置保持在同一个视图位置.

更新:

为此,我正在储蓄

this.offset; = this.container.scrollHeight - this.container.scrollTop;
Run Code Online (Sandbox Code Playgroud)

并在更新后添加了一行 this.items

this.listService.index((items) => {
  this.items = items
  this.container.scrollTop = this.container.scrollHeight - this.offset;
})
Run Code Online (Sandbox Code Playgroud)

这不起作用,但用超时包装这个工作正是我想要的.

setTimeout(() => {
  this.scrollPosition.restore()
}, 300)
Run Code Online (Sandbox Code Playgroud)

更新后this.items,渲染新的dom元素会有延迟.

如何获得添加新元素的事件?

Fil*_*auc 7

我认为这样的事情对你有用:

模板

<div id="container" #cont>...
Run Code Online (Sandbox Code Playgroud)

成分

@ViewChild('cont') contEl: any;

thisIsCalledWhenNewItemISAdded() {
   let current = this.contEl.nativeElement.scrollTop;

   // ...Item added

   this.contEl.nativeElement.scrollTop = current;
}
Run Code Online (Sandbox Code Playgroud)

所以你使用@ViewChild装饰器来获取组件中的元素。然后scrollTop在添加新项目之前捕获 ,并在添加项目后将其设置回来。

  • 无论如何,在更新项目后,scrollTop 保持不变。我想更改 scrollTop 以便在新项目添加到顶部时视图中的项目不会被推下。更新了我的问题。谢谢 (5认同)