File

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

Description

Service to alert listeners when they should recalculate its size or layout.

Index

Properties
Methods

Methods

addListener
addListener(listener: ResizeListener)

Registers the given listener into ResizeService.

Parameters :
Name Type Optional
listener ResizeListener No
Returns : void
Private fireDoResize
fireDoResize()

Actually notify all listeners to do resize.

Returns : void
removeListener
removeListener(listener: ResizeListener)

Unregisters the given listener from the ResizeService.

Parameters :
Name Type Optional
listener ResizeListener No
Returns : void
resizeAll
resizeAll()

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.

Returns : void

Properties

Private listeners
Default value : new Set<ResizeListener>()

Set of listeners.

Private resizeTimer
Default value : -1

Id of scheduled fireDoResize() call.

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 ""