angular - 如何在 cdk-virtual-scroll-viewport 内滚动时触发?

标签 angular events scroll virtualscroll

我在 Angular 7 中使用虚拟滚动。我创建了一个 CdkVirtualScrollViewport 并且我会为每个滚动事件添加一个监听器。我的意思是我希望在该视口(viewport)内滚动时收到通知。

我试图在我的组件中注入(inject) scrollDispatcher,但我看到 scrolled() 在整个组件上滚动时被触发,然后我发现它是绑定(bind)的到组件,而不仅仅是 CdkVirtualScrollViewport

这是我的代码:

@ViewChild(CdkVirtualScrollViewport) virtualScroll: CdkVirtualScrollViewport;

items: Array<any>;

constructor(private scrollDispatcher: ScrollDispatcher, private cd: ChangeDetectorRef) {
this.items = [];
}

ngOnInit(): void {
  for (let i = 0; i < 100; i++) {
    this.items.push(i);
  }
}

ngAfterViewInit(): void {
this.scrollDispatcher.scrolled()
  .subscribe(event => {
    console.log('scrolled');
  });
}

如您所见,CdkVirtualScrollViewport 是我组件中的一个子元素:

<div class="header">
  {{header}}
</div>

<div class="container">
  <cdk-virtual-scroll-viewport itemSize="4" class='example-viewport'>
    <li *cdkVirtualFor="let item of items" class='example-item' >{{item}}</li>
  </cdk-virtual-scroll-viewport>
</div>

<div class="footer">
  {{footer}}
</div>

这是完整的代码:https://stackblitz.com/edit/angular7-scroll-dispatcher

也许我可以使用 scrollDispatcherregister() 方法...但我应该将 CdkScrollable 传递给它,而不是我的CdkVirtualScrollViewport 元素。

那么,我怎样才能只监听我的虚拟滚动视口(viewport)滚动事件呢?

最佳答案

CdkVirtualScrollViewport中监听滚动事件的方法是使用elementScrolled()方法:

this.virtualScroll.elementScrolled()
  .subscribe(event => {
    console.log('scrolled');
  });

所以不需要注入(inject)scrollDispatcher并注册任何元素...

关于angular - 如何在 cdk-virtual-scroll-viewport 内滚动时触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54922301/

相关文章:

c# - 显示更改通知

objective-c - 惯性滚动和-ScrollWheel : on OS X

ios - 如何修复 'data of UITableViewCell exchange'?

java - 将 Web 应用程序连接到离线编译器 (Java/Python)

angular - 使用 Angular Router 时防止通过 href ="#"重定向

javascript - 如何使用angularjs在窗口关闭时触发一个函数

python - 我如何查看单击了哪个 tkinter Canvas 形状?

angular - Ngx-table angular2 swimlane com 编译问题

angular - 无法分配给对象的只读属性 'stopImmediatePropagation'

javascript - 仅当元素到达窗口顶部时调用函数一次