Je voudrais effectuer certaines tâches en fonction de l'événement de redimensionnement de la fenêtre (à la charge et dynamiquement).
Actuellement, j'ai mon DOM comme suit:
<div id="Harbour">
<div id="Port" (window:resize)="onResize($event)" >
<router-outlet></router-outlet>
</div>
</div>
L'événement se déclenche correctement
export class AppComponent {
onResize(event) {
console.log(event);
}
}
Comment récupérer la largeur et la hauteur de cet objet événement?
Merci.
javascript
angular
DanAbdn
la source
la source
innerHeight
et lesinnerWidth
propriétés ..console.log(event.target.innerWidth )
Réponses:
ou en utilisant le décorateur HostListener :
Sont pris en charge des objectifs mondiaux
window
,document
etbody
.Jusqu'à ce que https://github.com/angular/angular/issues/13248 soit implémenté dans Angular, il est préférable que les performances s'abonnent aux événements DOM impérativement et utilisent RXJS pour réduire la quantité d'événements comme indiqué dans certaines des autres réponses.
la source
document
,window
etbody
github.com/angular/angular/blob/...import { Component, OnInit, HostListener } from '@angular/core';
@ La réponse de Günter est correcte. Je voulais juste proposer une autre méthode.
Vous pouvez également ajouter la liaison hôte à l'intérieur du
@Component()
-décorateur. Vous pouvez placer l'événement et l'appel de fonction souhaité dans la propriété host-metadata-comme:la source
window.innerWidth
intérieurngOnInit
ou desngAfterViewInit
méthodes?Je sais que cela a été demandé il y a longtemps, mais il existe une meilleure façon de le faire maintenant! Je ne sais pas si quelqu'un verra cette réponse. Évidemment vos importations:
Puis dans votre composant:
Assurez-vous ensuite de vous désinscrire sur destroy!
la source
import { fromEvent, Observable,Subscription } from "rxjs";
this.resizeSubscription$ = this.resizeObservable$.pipe(debounceTime(1000)).subscribe( evt => { console.log('event: ', evt) })
La bonne façon de procéder consiste à utiliser la classe EventManager pour lier l'événement. Cela permet à votre code de fonctionner sur d'autres plateformes, par exemple le rendu côté serveur avec Angular Universal.
L'utilisation dans un composant est aussi simple que d'ajouter ce service en tant que fournisseur à votre app.module, puis de l'importer dans le constructeur d'un composant.
la source
window
objet, tout comme un serveur n'en a paswindow
. Je ne suis pas familier avec les différentes configurations mobiles, mais vous devriez pouvoir facilement adapter le code ci-dessus pour le lier au bon écouteur d'événements globalMobile does not have a window object
.... pourquoi pensez-vous que les navigateurs mobiles n'ont pas d'objet fenêtre?Voici une meilleure façon de procéder. Basé sur Birowsky réponse .
Étape 1: Créez un
angular service
avec RxJS Observables .Étape 2: Injectez ce qui précède
service
et abonnez-vous à l'un des élémentsObservables
créés dans le service où que vous souhaitiez recevoir l'événement de redimensionnement de la fenêtre.Une bonne compréhension de la programmation réactive aidera toujours à surmonter les problèmes difficiles. J'espère que cela aide quelqu'un.
la source
Je n'ai vu personne parler
MediaMatcher
deangular/cdk
.Vous pouvez définir une MediaQuery et y attacher un écouteur - puis n'importe où sur votre modèle (ou ts), vous pouvez invoquer des éléments si le Matcher correspond. LiveExample
App.Component.ts
App.Component.Html
App.Component.css
source: https://material.angular.io/components/sidenav/overview
la source
En supposant que <600px signifie mobile pour vous, vous pouvez utiliser cet observable et vous y abonner:
Nous avons d'abord besoin de la taille actuelle de la fenêtre. Nous créons donc un observable qui n'émet qu'une seule valeur: la taille actuelle de la fenêtre.
Ensuite, nous devons créer un autre observable, afin de savoir quand la taille de la fenêtre a été modifiée. Pour cela, nous pouvons utiliser l'opérateur "fromEvent". Pour en savoir plus sur les opérateurs de rxjs, veuillez visiter: rxjs
Fusionnez ces deux flux pour recevoir notre observable:
Vous pouvez maintenant vous y abonner comme ceci:
N'oubliez pas de vous désinscrire :)
la source
Il existe un service ViewportRuler en CDK angulaire. Il s'exécute en dehors de la zone et fonctionne également avec le rendu côté serveur.
la source
Sur la base de la solution de @cgatian, je suggère la simplification suivante:
Usage:
la source
Ce n'est pas exactement la réponse à la question, mais cela peut aider quelqu'un qui a besoin de détecter des changements de taille sur n'importe quel élément.
J'ai créé une bibliothèque qui ajoute un
resized
événement à n'importe quel élément - Événement de redimensionnement angulaire .Il utilise en interne à
ResizeSensor
partir des requêtes d'éléments CSS .Exemple d'utilisation
HTML
Manuscrit
la source
J'ai écrit cette lib pour trouver une fois que la taille des limites des composants change (redimensionne) dans Angular, cela peut aider d'autres personnes. Vous pouvez le mettre sur le composant racine, fera la même chose que le redimensionnement de la fenêtre.
Étape 1: importez le module
Étape 2: ajoutez la directive comme ci-dessous
<simple-component boundSensor></simple-component>
Étape 3: recevoir les détails de la taille des limites
la source
Sur Angular2 (2.1.0), j'utilise ngZone pour capturer l'événement de changement d'écran.
Jetez un oeil sur l'exemple:
J'espère que cette aide!
la source
Le code ci-dessous permet d'observer tout changement de taille pour un div donné en angulaire.
puis dans le Composant:
la source
toutes les solutions ne fonctionnent pas côté serveur ou en universel angulaire
la source
J'ai vérifié la plupart de ces réponses. a ensuite décidé de consulter la documentation Angular sur la mise en page .
Angular a son propre Observer pour détecter différentes tailles et il est facile à implémenter dans le composant ou un service.
un exemple simple serait:
J'espère que ça aide
la source