Solución:
Terminé implementando un servicio que usa la biblioteca element-resize-detector (https://github.com/wnr/element-resize-detector). No se pudo encontrar un archivo de definición de TypeScript, pero con un poco de ayuda (use la biblioteca element-resize-detector en una aplicación Angular2), implementé lo siguiente:
element-resize-detector.d.ts
declare function elementResizeDetectorMaker(options?: elementResizeDetectorMaker.ErdmOptions): elementResizeDetectorMaker.Erd;
declare namespace elementResizeDetectorMaker {
interface ErdmOptions {
strategy?: 'scroll' | 'object';
}
interface Erd {
listenTo(element: HTMLElement, callback: (elem: HTMLElement) => void);
removeListener(element: HTMLElement, callback: (elem: HTMLElement) => void);
removeAllListeners(element: HTMLElement);
uninstall(element: HTMLElement);
}
}
export = elementResizeDetectorMaker;
resize.service.ts
import { Injectable } from '@angular/core';
import * as elementResizeDetectorMaker from 'element-resize-detector';
@Injectable()
export class ResizeService {
private resizeDetector: any;
constructor() {
this.resizeDetector = elementResizeDetectorMaker({ strategy: 'scroll' });
}
addResizeEventListener(element: HTMLElement, handler: Function) {
this.resizeDetector.listenTo(element, handler);
}
removeResizeEventListener(element: HTMLElement) {
this.resizeDetector.uninstall(element);
}
}
my-component.ts
import { Component } from '@angular/core';
import { ResizeService } from '../resize/index';
@Component({
selector: 'my-component',
template: ``
})
export class MyComponent {
constructor(private el: ElementRef, private resizeService: ResizeService) {
}
ngOnInit() {
this.resizeService.addResizeEventListener(this.el.nativeElement, (elem) => {
// some resize event code...
});
}
ngOnDestroy() {
this.resizeService.removeResizeEventListener(this.el.nativeElement);
}
}
Esta biblioteca angular 7 hace un trabajo bastante bueno: https://www.npmjs.com/package/angular-resize-event
<div (resized)="onResized($event)"></div>
import { Component } from '@angular/core';
// Import the resized event model
import { ResizedEvent } from 'angular-resize-event';
@Component({...})
class MyComponent {
width: number;
height: number;
onResized(event: ResizedEvent) {
this.width = event.newWidth;
this.height = event.newHeight;
}
}
Escribí esta directiva Angular2 para resolver esto.
Puedes instalarlo por npm install bound-sensor
. La ventaja de usar este método es que le indica una vez que cambia el tamaño del componente principal y no depende del cambio de tamaño de la ventana. Imagine que necesita expandir y actualizar su base de contenido en el tamaño de su padre, esto lo resuelve fácilmente.