Evento de cambio de tamaño de ventana angular

Resuelto DanAbdn asked hace 9 años • 19 respuestas

Me gustaría realizar algunas tareas basadas en el evento de cambio de tamaño de la ventana (durante la carga y dinámicamente).

Actualmente tengo mi DOM de la siguiente manera:

<div id="Harbour">
    <div id="Port" (window:resize)="onResize($event)" >
        <router-outlet></router-outlet>
    </div>
</div>

El evento se dispara correctamente

export class AppComponent {
    onResize(event) {
        console.log(event);
    }
}

¿Cómo recupero el ancho y el alto de este objeto de evento?

Gracias.

DanAbdn avatar Feb 21 '16 01:02 DanAbdn
Aceptado
<div (window:resize)="onResize($event)"
onResize(event) {
  event.target.innerWidth;
}

o usando el decorador HostListener :

@HostListener('window:resize', ['$event'])
onResize(event) {
  event.target.innerWidth;
}

Los objetivos globales admitidos son window, documenty body.

Hasta que https://github.com/angular/angular/issues/13248 se implemente en Angular, es mejor para el rendimiento suscribirse a eventos DOM de manera imperativa y usar RXJS para reducir la cantidad de eventos como se muestra en algunas de las otras respuestas.

Günter Zöchbauer avatar Feb 20 '2016 19:02 Günter Zöchbauer

Sé que esto se preguntó hace mucho tiempo, ¡pero ahora hay una mejor manera de hacerlo! Sin embargo, no estoy seguro de si alguien verá esta respuesta. Obviamente sus importaciones:

import { fromEvent, Observable, Subscription } from "rxjs";

Luego en tu componente:

resizeObservable$: Observable<Event>
resizeSubscription$: Subscription

ngOnInit() {
    this.resizeObservable$ = fromEvent(window, 'resize')
    this.resizeSubscription$ = this.resizeObservable$.subscribe( evt => {
      console.log('event: ', evt)
    })
}

¡Entonces asegúrese de cancelar la suscripción al destruir!

ngOnDestroy() {
    this.resizeSubscription$.unsubscribe()
}
Chris Stanley avatar Aug 22 '2018 14:08 Chris Stanley

La respuesta de @Günter es correcta. Sólo quería proponer otro método más.

También puede agregar el enlace de host dentro del @Component()decorador. Puede colocar el evento y la llamada a la función deseada en la propiedad de metadatos del host de esta manera:

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  host: {
    '(window:resize)': 'onResize($event)'
  }
})
export class AppComponent{
   onResize(event){
     event.target.innerWidth; // window width
   }
}
John avatar Dec 01 '2016 11:12 John