projects/i-components/src/lib/services/resize.service.ts
Listerners of ResizeService
, which will be notified when they
should recalculate its size or layout.
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;
}