File

projects/i-components/src/lib/services/resize.service.ts

Description

Listerners of ResizeService, which will be notified when they should recalculate its size or layout.

Index

Methods

Methods

doResize
doResize()

Recalculate component layout or size in response to other component resize.

Returns : void
import { Injectable } from '@angular/core';

/**
 * Service to alert listeners when they should recalculate its size or layout.
 *
 * @export
 * @class ResizeService
 */
@Injectable({
  providedIn: 'root',
})
export class ResizeService {
  /**
   * Set of listeners.
   *
   * @private
   * @memberof ResizeService
   */
  private listeners = new Set<ResizeListener>();

  /**
   * Id of scheduled `fireDoResize()` call.
   *
   * @private
   * @memberof ResizeService
   */
  private resizeTimer = -1;

  /**
   * Registers the given listener into `ResizeService`.
   *
   * @param {ResizeListener} listener
   * @memberof ResizeService
   */
  addListener(listener: ResizeListener): void {
    this.listeners.add(listener);
  }

  /**
   * Unregisters the given listener from the `ResizeService`.
   *
   * @param {ResizeListener} listener
   * @memberof ResizeService
   */
  removeListener(listener: ResizeListener): void {
    this.listeners.delete(listener);
  }

  /**
   * Notify all listeners to do resize.
   *
   * Note: calls to `resizeAll()` are delayed to bundle multiple calls
   * together and reduce the number of notifications to listeners.
   *
   * @memberof ResizeService
   */
  resizeAll(): void {
    if (this.resizeTimer != -1) {
      window.clearTimeout(this.resizeTimer);
    }
    this.resizeTimer = window.setTimeout(() => this.fireDoResize(), 100);
  }

  /**
   * Actually notify all listeners to do resize.
   *
   * @private
   * @memberof ResizeService
   */
  private fireDoResize(): void {
    this.resizeTimer = -1;
    for (const listener of new Set(this.listeners)) {
      listener.doResize();
    }
  }
}

/**
 * Listerners of `ResizeService`, which will be notified when they
 * should recalculate its size or layout.
 *
 * @export
 * @interface ResizeListener
 */
export interface ResizeListener {
  /**
   * Recalculate component layout or size in response to other component resize.
   *
   * @memberof ResizeListener
   */
  doResize(): void;
}

result-matching ""

    No results matching ""