Ich möchte einige Aufgaben basierend auf dem Ereignis zur Größenänderung des Fensters ausführen (beim Laden und dynamisch).
Derzeit habe ich mein DOM wie folgt:
<div id="Harbour">
<div id="Port" (window:resize)="onResize($event)" >
<router-outlet></router-outlet>
</div>
</div>
Das Ereignis wird korrekt ausgelöst
export class AppComponent {
onResize(event) {
console.log(event);
}
}
Wie rufe ich die Breite und Höhe von diesem Ereignisobjekt ab?
Vielen Dank.
javascript
angular
DanAbdn
quelle
quelle
innerHeight
undinnerWidth
Eigenschaften bekommen ..console.log(event.target.innerWidth )
Antworten:
oder mit dem HostListener-Dekorator :
Unterstützte globale Ziele sind
window
,document
undbody
.Bis um https://github.com/angular/angular/issues/13248 in Angular implementiert ist, ist es für die Leistung besser, DOM-Ereignisse unbedingt zu abonnieren und RXJS zu verwenden, um die Anzahl der Ereignisse zu reduzieren, wie in einigen anderen Antworten gezeigt.
quelle
document
,window
undbody
github.com/angular/angular/blob/…import { Component, OnInit, HostListener } from '@angular/core';
@ Günters Antwort ist richtig. Ich wollte nur noch eine andere Methode vorschlagen.
Sie können auch die Host-Bindung im
@Component()
-decorator hinzufügen. Sie können das Ereignis und den gewünschten Funktionsaufruf wie folgt in die Eigenschaft host-metadata einfügen:quelle
window.innerWidth
InsidengOnInit
oderngAfterViewInit
Methoden zu machen?Ich weiß, dass dies vor langer Zeit gefragt wurde, aber es gibt jetzt einen besseren Weg, dies zu tun! Ich bin mir nicht sicher, ob jemand diese Antwort sehen wird. Offensichtlich Ihre Importe:
Dann in Ihrer Komponente:
Dann melden Sie sich unbedingt bei destroy ab!
quelle
import { fromEvent, Observable,Subscription } from "rxjs";
this.resizeSubscription$ = this.resizeObservable$.pipe(debounceTime(1000)).subscribe( evt => { console.log('event: ', evt) })
Der richtige Weg, dies zu tun, besteht darin, die EventManager- Klasse zum Binden des Ereignisses zu verwenden. Auf diese Weise kann Ihr Code auf alternativen Plattformen verwendet werden, z. B. beim serverseitigen Rendern mit Angular Universal.
Die Verwendung in einer Komponente ist so einfach wie das Hinzufügen dieses Dienstes als Anbieter zu Ihrem app.module und das anschließende Importieren in den Konstruktor einer Komponente.
quelle
window
Objekt, genauso wie ein Server kein hatwindow
.Mobile does not have a window object
.... warum haben mobile Browser Ihrer Meinung nach kein Fensterobjekt?Hier ist ein besserer Weg, dies zu tun. Basierend auf Birowskys Antwort.
Schritt 1: Erstellen Sie eine
angular service
mit RxJS Observables .Schritt 2: Injizieren Sie das Obige
service
und abonnieren Sie eines derObservables
im Service erstellten Ereignisse, wo immer Sie das Fenstergrößenänderungsereignis erhalten möchten.Ein fundiertes Verständnis der reaktiven Programmierung hilft immer bei der Überwindung schwieriger Probleme. Hoffe das hilft jemandem.
quelle
Ich habe jemand reden hier nicht über gesehen
MediaMatcher
vonangular/cdk
.Sie können eine MediaQuery definieren und einen Listener daran anhängen. Dann können Sie an einer beliebigen Stelle in Ihrer Vorlage (oder in ts) Inhalte aufrufen, wenn der Matcher übereinstimmt. LiveExample
App.Component.ts
App.Component.Html
App.Component.css
Quelle: https://material.angular.io/components/sidenav/overview
quelle
Angenommen, <600px bedeutet für Sie mobil, können Sie dieses Observable verwenden und abonnieren:
Zuerst benötigen wir die aktuelle Fenstergröße. Wir erstellen also eine Observable, die nur einen einzigen Wert ausgibt: die aktuelle Fenstergröße.
Dann müssen wir ein weiteres Observable erstellen, damit wir wissen, wann die Fenstergröße geändert wurde. Hierfür können wir den Operator "fromEvent" verwenden. Um mehr über die Betreiber von rxjs zu erfahren, besuchen Sie bitte: rxjs
Verschmelze diese beiden Ströme, um unser Beobachtbares zu erhalten:
Jetzt können Sie es folgendermaßen abonnieren:
Denken Sie daran, sich abzumelden :)
quelle
Es gibt einen ViewportRuler- Dienst in Angular CDK. Es wird außerhalb der Zone ausgeführt und funktioniert auch mit serverseitigem Rendering.
quelle
Basierend auf der Lösung von @cgatian würde ich die folgende Vereinfachung vorschlagen:
Verwendung:
quelle
Dies ist keine genaue Antwort auf die Frage, kann jedoch jemandem helfen, der Größenänderungen an einem Element erkennen muss.
Ich habe eine Bibliothek erstellt, die
resized
jedem Element ein Ereignis hinzufügt - Angular Resize Event .Es wird intern
ResizeSensor
aus CSS-Elementabfragen verwendet .Anwendungsbeispiel
HTML
Typoskript
quelle
Ich habe diese Bibliothek geschrieben , um zu finden, wie sich die Größe der Komponentengrenzen in Angular ändert (Größe ändern). Möge dies anderen Menschen helfen. Sie können es auf die Stammkomponente setzen, wird das gleiche tun wie die Fenstergröße ändern.
Schritt 1: Importieren Sie das Modul
Schritt 2: Fügen Sie die Direktive wie unten hinzu
<simple-component boundSensor></simple-component>
Schritt 3: Erhalten Sie die Details zur Grenzgröße
quelle
Auf Angular2 (2.1.0) verwende ich ngZone, um das Bildschirmänderungsereignis zu erfassen.
Schauen Sie sich das Beispiel an:
Ich hoffe diese Hilfe!
quelle
Mit dem folgenden Code können Sie jede Größenänderung für ein bestimmtes Div in Angular beobachten.
dann in der Komponente:
quelle
Alle Lösungen funktionieren nicht serverseitig oder in Angular Universal
quelle
Ich habe die meisten dieser Antworten überprüft. Dann entschied ich mich, die Angular-Dokumentation zum Layout zu lesen .
Angular verfügt über einen eigenen Observer zum Erkennen unterschiedlicher Größen und ist einfach in die Komponente oder einen Service zu implementieren.
Ein einfaches Beispiel wäre:
ich hoffe es hilft
quelle