Chciałbym wykonać niektóre zadania na podstawie zdarzenia zmiany rozmiaru okna (przy obciążeniu i dynamicznie).
Obecnie mam swój DOM w następujący sposób:
<div id="Harbour">
<div id="Port" (window:resize)="onResize($event)" >
<router-outlet></router-outlet>
</div>
</div>
Zdarzenie poprawnie się uruchamia
export class AppComponent {
onResize(event) {
console.log(event);
}
}
Jak pobrać szerokość i wysokość z tego obiektu zdarzenia?
Dzięki.
javascript
angular
DanAbdn
źródło
źródło
innerHeight
iinnerWidth
właściwości ..console.log(event.target.innerWidth )
Odpowiedzi:
lub używając dekoratora HostListener :
Obsługiwane są globalne cele
window
,document
orazbody
.Dopóki https://github.com/angular/angular/issues/13248 nie zostanie zaimplementowany w Angular, lepiej jest wydajnie subskrybować zdarzenia DOM i używać RXJS w celu zmniejszenia liczby zdarzeń, jak pokazano w niektórych innych odpowiedziach.
źródło
document
,window
ibody
github.com/angular/angular/angular/blob/…import { Component, OnInit, HostListener } from '@angular/core';
@ Odpowiedź Güntera jest poprawna. Chciałem tylko zaproponować inną metodę.
Możesz także dodać powiązanie hosta wewnątrz
@Component()
-decoratora. Możesz umieścić zdarzenie i pożądane wywołanie funkcji we właściwości host-metadata-w następujący sposób:źródło
window.innerWidth
wnętrzengOnInit
lubngAfterViewInit
metody?Wiem, że zapytano o to dawno temu, ale jest na to lepszy sposób! Nie jestem jednak pewien, czy ktokolwiek zobaczy tę odpowiedź. Oczywiście twój import:
Następnie w swoim komponencie:
Następnie zrezygnuj z subskrypcji na zniszcz!
źródło
import { fromEvent, Observable,Subscription } from "rxjs";
this.resizeSubscription$ = this.resizeObservable$.pipe(debounceTime(1000)).subscribe( evt => { console.log('event: ', evt) })
Prawidłowym sposobem na to jest użycie klasy EventManager do powiązania zdarzenia. Pozwala to na działanie kodu na alternatywnych platformach, na przykład renderowanie po stronie serwera za pomocą Angular Universal.
Użycie w komponencie jest tak proste, jak dodanie tej usługi jako dostawcy do modułu app.module, a następnie zaimportowanie jej do konstruktora komponentu.
źródło
window
obiektu, tak jak serwer nie mawindow
. Nie jestem zaznajomiony z różnymi konfiguracjami mobilnymi, ale powinieneś być w stanie łatwo dostosować powyższy kod, aby połączyć się z właściwym globalnym odbiornikiem zdarzeńMobile does not have a window object
.... dlaczego twoim zdaniem przeglądarki mobilne nie mają obiektu okna?Oto lepszy sposób, aby to zrobić. Na podstawie odpowiedzi Birowsky'ego .
Krok 1: Utwórz
angular service
z RxJS Observables .Krok 2: Wstrzyknij powyższe
service
i subskrybuj dowolne zObservables
utworzonych w usłudze miejsc, w których chcesz otrzymywać zdarzenia zmiany rozmiaru okna.Dobre zrozumienie programowania reaktywnego zawsze pomoże w przezwyciężeniu trudnych problemów. Mam nadzieję, że to komuś pomoże.
źródło
Nie widziałem nikogo mówić o
MediaMatcher
odangular/cdk
.Możesz zdefiniować MediaQuery i dołączyć do niego detektor - wtedy w dowolnym miejscu szablonu (lub ts) możesz wywoływać różne rzeczy, jeśli Matcher jest dopasowany. LiveExample
App.Component.ts
App.Component.Html
App.Component.css
źródło: https://material.angular.io/components/sidenav/overview
źródło
Zakładając, że <600px oznacza dla Ciebie mobilny, możesz użyć tego obserwowalnego i zasubskrybować:
Najpierw potrzebujemy bieżącego rozmiaru okna. Tworzymy więc obserwowalny, który emituje tylko jedną wartość: bieżący rozmiar okna.
Następnie musimy utworzyć kolejny obserwowalny, abyśmy wiedzieli, kiedy zmienił się rozmiar okna. W tym celu możemy użyć operatora „fromEvent”. Aby dowiedzieć się więcej o operatorach rxjs, odwiedź: rxjs
Połącz te dwa strumienie, aby otrzymać nasz obserwowalny:
Teraz możesz subskrybować to w ten sposób:
Pamiętaj, aby wypisać się :)
źródło
W kątowym CDK znajduje się usługa ViewportRuler . Działa poza strefą i działa również z renderowaniem po stronie serwera.
źródło
W oparciu o rozwiązanie @cgatian sugerowałbym następujące uproszczenie:
Stosowanie:
źródło
To nie jest dokładnie odpowiedź na pytanie, ale może pomóc komuś, kto musi wykryć zmiany rozmiaru dowolnego elementu.
Utworzyłem bibliotekę, która dodaje
resized
zdarzenie do dowolnego elementu - Angular Resize Event .Wykorzystuje wewnętrznie
ResizeSensor
z zapytań o elementy CSS .Przykładowe użycie
HTML
Maszynopis
źródło
Napisałem tę bibliotekę, aby znaleźć raz zmianę rozmiaru granicy komponentu (zmianę rozmiaru) w Angular, może to pomóc innym ludziom. Możesz umieścić go na komponencie głównym, zrobi to samo, co zmiana rozmiaru okna.
Krok 1: Zaimportuj moduł
Krok 2: Dodaj dyrektywę jak poniżej
<simple-component boundSensor></simple-component>
Krok 3: Odbierz szczegóły rozmiaru granicy
źródło
W Angular2 (2.1.0) używam ngZone do przechwytywania zdarzenia zmiany ekranu.
Spójrz na przykład:
Mam nadzieję, że ta pomoc!
źródło
Poniższy kod pozwala zaobserwować dowolną zmianę rozmiaru dla dowolnego div w Angular.
następnie w komponencie:
źródło
wszystkie rozwiązania nie działają po stronie serwera lub w Angular Universal
źródło
Sprawdziłem większość tych odpowiedzi. następnie postanowiłem sprawdzić dokumentację Angular dotyczącą układu .
Angular ma własnego obserwatora do wykrywania różnych rozmiarów i można go łatwo wdrożyć do komponentu lub usługi.
prostym przykładem byłoby:
mam nadzieję, że to pomoże
źródło