Me gustaría realizar algunas tareas basadas en el evento de cambio de tamaño de la ventana (en 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 la altura de este objeto de evento?
Gracias.
javascript
angular
DanAbdn
fuente
fuente
innerHeight
y susinnerWidth
propiedades ..console.log(event.target.innerWidth )
Respuestas:
o usando el decorador HostListener :
Apoyados objetivos globales son
window
,document
ybody
.Hasta que https://github.com/angular/angular/issues/13248 se implemente en Angular, es mejor que el rendimiento se suscriba a los eventos DOM de forma imperativa y use RXJS para reducir la cantidad de eventos como se muestra en algunas de las otras respuestas.
fuente
document
,window
ybody
github.com/angular/angular/blob/…import { Component, OnInit, HostListener } from '@angular/core';
La respuesta de @ Günter es correcta. Solo quería proponer otro método.
También puede agregar el enlace de host dentro del
@Component()
decorador. Puede poner el evento y la llamada a la función deseada en la propiedad de metadatos del host de la siguiente manera:fuente
window.innerWidth
interiorngOnInit
ongAfterViewInit
métodos?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:
Luego en su componente:
¡Entonces asegúrese de darse de baja en destruir!
fuente
import { fromEvent, Observable,Subscription } from "rxjs";
this.resizeSubscription$ = this.resizeObservable$.pipe(debounceTime(1000)).subscribe( evt => { console.log('event: ', evt) })
La forma correcta de hacer esto es utilizar la clase EventManager para vincular el evento. Esto permite que su código funcione en plataformas alternativas, por ejemplo, renderizado del lado del servidor con Angular Universal.
El uso en un componente es tan simple como agregar este servicio como proveedor a su módulo de aplicación y luego importarlo en el constructor de un componente.
fuente
window
objeto, al igual que un servidor no tiene unwindow
. No estoy familiarizado con las diferentes configuraciones móviles, pero debería poder adaptar fácilmente el código anterior para enlazar con el oyente de eventos global correctoMobile does not have a window object
... ¿por qué crees que los navegadores móviles no tienen un objeto de ventana?Aquí hay una mejor manera de hacerlo. Basado en la respuesta de Birowsky .
Paso 1: Crea un
angular service
archivo con RxJS Observables .Paso 2: inyecte lo anterior
service
y suscríbase a cualquiera de losObservables
creados dentro del servicio donde desee recibir el evento de cambio de tamaño de la ventana.Una buena comprensión de la programación reactiva siempre ayudará a superar problemas difíciles. Espero que esto ayude a alguien.
fuente
No he visto a nadie hablando
MediaMatcher
deangular/cdk
.Puede definir un MediaQuery y adjuntarle un oyente; luego, en cualquier lugar de su plantilla (o ts) puede invocar cosas si el Matcher coincide. LiveExample
App.Component.ts
App.Component.Html
App.Component.css
fuente: https://material.angular.io/components/sidenav/overview
fuente
Suponiendo que <600px significa móvil para usted, puede usar este observable y suscribirse a él:
Primero necesitamos el tamaño actual de la ventana. Entonces creamos un observable que solo emite un único valor: el tamaño de la ventana actual.
Luego, necesitamos crear otro observable, para saber cuándo se cambió el tamaño de la ventana. Para esto podemos usar el operador "fromEvent". Para obtener más información sobre los operadores de rxjs, visite: rxjs
Combine estas dos corrientes para recibir nuestro observable:
Ahora puedes suscribirte así:
Recuerde darse de baja :)
fuente
Hay un servicio ViewportRuler en angular CDK. Se ejecuta fuera de la zona y también funciona con renderizado del lado del servidor.
fuente
Basado en la solución de @cgatian, sugeriría la siguiente simplificación:
Uso:
fuente
Esta no es exactamente la respuesta a la pregunta, pero puede ayudar a alguien que necesita detectar cambios de tamaño en cualquier elemento.
He creado una biblioteca que agrega
resized
eventos a cualquier elemento: evento de cambio de tamaño angular .Utiliza internamente
ResizeSensor
de CSS Element Queries .Ejemplo de uso
HTML
Mecanografiado
fuente
Escribí esta biblioteca para encontrar una vez que el cambio del tamaño del límite del componente (redimensionar) en Angular, puede ayudar a otras personas. Puede ponerlo en el componente raíz, hará lo mismo que cambiar el tamaño de la ventana.
Paso 1: importe el módulo
Paso 2: agregue la directiva como a continuación
<simple-component boundSensor></simple-component>
Paso 3: reciba los detalles del tamaño del límite
fuente
En Angular2 (2.1.0) uso ngZone para capturar el evento de cambio de pantalla.
Echa un vistazo al ejemplo:
Espero esta ayuda!
fuente
El siguiente código permite observar cualquier cambio de tamaño para cualquier div dado en Angular.
luego en el Componente:
fuente
todas las soluciones no funcionan con el lado del servidor o en angular universal
fuente
Revisé la mayoría de estas respuestas. luego decidió consultar la documentación angular en el diseño .
Angular tiene su propio observador para detectar diferentes tamaños y es fácil de implementar en el componente o servicio.
Un ejemplo simple sería:
Espero eso ayude
fuente