Angular CDK Scrolling 之 ViewportRuler(源码阅读)


ViewportRuler 是一种可注入的服务,用于衡量浏览器视口的范围。

一、源码

// 默认情况下限制调整大小事件的时间(单位为ms)。
export const DEFAULT_RESIZE_TIME = 20;

export interface ViewportScrollPosition {
   
  top: number;
  left: number;
}

/**
 * 获取浏览器视口边界的服务。
 * @docs-private
 */
@Injectable({
   providedIn: 'root'})
export class ViewportRuler implements OnDestroy {
   
  // 缓存浏览器视口大小
  private _viewportSize: {
   width: number; height: number} | null;

  // 视口改变的事件流
  private readonly _change = new Subject<Event>();

  // 事件监听器,用于处理视口更改事件
  private _changeListener = (event: Event) => {
   
    this._change.next(event);
  };

  // 用于引用正确的文档/窗口
  protected _document: Document;

  constructor(
    private _platform: Platform,
    ngZone: NgZone,
    @Optional() @Inject(DOCUMENT) document: any,
  ) {
   
    this._document = document;

    ngZone.runOutsideAngular(() => {
   
      if (_platform.isBrowser) {
   
        const window = this._getWindow();

        // 我们自己绑定事件,而不是通过诸如 RxJS 的 `fromEvent` 之类的东西,这样我们就可以确保它们被绑定在 NgZone 之外。
        window.addEventListener('resize', this._changeListener);
        window.addEventListener('orientationchange', this._changeListener);
      }

      // 清除缓存的位置,以便下次需要时重新测量视口。 我们不需要跟踪订阅,因为它是在销毁时完成的。
      this<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值