cdk 文档有时并不容易理解,而且其中到处都是隐藏的宝石:)
here https://material.angular.io/cdk/overlay/overview#scroll-strategies它指出;
每个策略通常都会注入 ScrollDispatcher(来自 @angular/cdk/scrolling),以便在滚动发生时收到通知。
我从这句话中了解到的是Overlay
重新定位自己以响应来自的事件ScrollDispatcher
。那么,这些滚动事件从哪里来呢?
不幸的是,文档中没有任何关于此的信息。所以我查看了代码并发现this https://github.com/angular/components/blob/aa2236820da4b14fb4fd9e6a57a05660b615da2c/src/cdk/scrolling/scroll-dispatcher.ts#L163
/** Sets up the global scroll listeners. */
private _addGlobalListener() {
this._globalSubscription = this._ngZone.runOutsideAngular(() => {
return fromEvent(window.document, 'scroll').subscribe(() => this._scrolled.next());
});
}
意思是ScrollDispatcher
监听滚动事件默认窗口.
在上面的情况下,它会响应窗口滚动时的事件,但不会响应内部容器。这符合我们迄今为止收集到的信息。
在这里我们可以得出结论Overlay
不会通知内部容器内发生的滚动事件,我们需要做的就是向内部容器注册ScrollDispatcher
在此刻cdk可滚动 https://material.angular.io/cdk/scrolling/api#CdkScrollable指令介入救援并放置cdkScrollable
在滚动内容器上解决了这个问题。
<div cdkScrollable style="height: 300px; overflow-y: auto">
这是一个工作demo https://stackblitz.com/edit/angular-7-popover-4ij7vh