Saya ingin melakukan beberapa tugas berdasarkan peristiwa ukuran kembali jendela (saat memuat dan secara dinamis).
Saat ini saya memiliki DOM saya sebagai berikut:
<div id="Harbour">
<div id="Port" (window:resize)="onResize($event)" >
<router-outlet></router-outlet>
</div>
</div>
Acara dengan benar menyala
export class AppComponent {
onResize(event) {
console.log(event);
}
}
Bagaimana cara mengambil Lebar dan Tinggi dari objek acara ini?
Terima kasih.
javascript
angular
DanAbdn
sumber
sumber
innerHeight
daninnerWidth
properti ..console.log(event.target.innerWidth )
Jawaban:
atau menggunakan dekorator HostListener :
Didukung target global
window
,document
danbody
.Sampai https://github.com/angular/angular/issues/13248 diimplementasikan di Angular, kinerja lebih baik untuk berlangganan acara DOM secara imperatif dan menggunakan RXJS untuk mengurangi jumlah acara seperti yang ditunjukkan dalam beberapa jawaban lain.
sumber
document
,,window
danbody
github.com/angular/angular/blob/…import { Component, OnInit, HostListener } from '@angular/core';
@ Günter jawabannya benar. Saya hanya ingin mengusulkan metode lain.
Anda juga bisa menambahkan host-binding di dalam
@Component()
-decorator. Anda dapat menempatkan acara dan panggilan fungsi yang diinginkan di properti host-metadata seperti:sumber
window.innerWidth
dalamngOnInit
, ataungAfterViewInit
metode?Saya tahu ini sudah lama ditanyakan, tetapi ada cara yang lebih baik untuk melakukan ini sekarang! Saya tidak yakin apakah ada yang akan melihat jawaban ini. Jelas impor Anda:
Kemudian di komponen Anda:
Maka pastikan untuk berhenti berlangganan saat menghancurkan!
sumber
import { fromEvent, Observable,Subscription } from "rxjs";
this.resizeSubscription$ = this.resizeObservable$.pipe(debounceTime(1000)).subscribe( evt => { console.log('event: ', evt) })
Cara yang benar untuk melakukan ini adalah dengan memanfaatkan kelas EventManager untuk mengikat acara. Ini memungkinkan kode Anda berfungsi di platform alternatif, misalnya rendering sisi server dengan Angular Universal.
Penggunaan dalam suatu komponen sesederhana menambahkan layanan ini sebagai penyedia ke app.module Anda dan kemudian mengimpornya dalam konstruktor komponen.
sumber
window
objek, sama seperti server tidak memilikiwindow
. Saya tidak terbiasa dengan konfigurasi seluler yang berbeda tetapi Anda harus dapat dengan mudah mengadaptasi kode di atas untuk mengikat ke pendengar acara global yang benarMobile does not have a window object
.... mengapa menurut Anda browser seluler tidak memiliki objek jendela?Ini cara yang lebih baik untuk melakukannya. Berdasarkan jawaban Birowsky .
Langkah 1: Buat
angular service
dengan RxJS Observables .Langkah 2: Suntikkan hal di atas
service
dan berlangganan ke salah satu yangObservables
dibuat dalam layanan di mana pun Anda ingin menerima acara mengubah ukuran jendela.Pemahaman yang baik tentang Pemrograman Reaktif akan selalu membantu dalam mengatasi masalah yang sulit. Semoga ini bisa membantu seseorang.
sumber
Saya tidak melihat orang berbicara tentang
MediaMatcher
dariangular/cdk
.Anda dapat mendefinisikan MediaQuery dan melampirkan pendengar ke dalamnya - lalu di mana pun di templat Anda (atau ts), Anda dapat meminta hal-hal jika Pencocokan cocok. Contoh Langsung
App.Component.ts
App.Component.Html
App.Component.css
sumber: https://material.angular.io/components/sidenav/overview
sumber
Dengan asumsi bahwa <600px berarti ponsel untuk Anda, Anda dapat menggunakan ini yang dapat diamati dan berlangganan:
Pertama kita perlu ukuran jendela saat ini. Jadi kami membuat diamati yang hanya memancarkan nilai tunggal: ukuran jendela saat ini.
Maka kita perlu membuat yang lain yang bisa diamati, sehingga kita tahu kapan ukuran jendela diubah. Untuk ini, kita dapat menggunakan operator "fromEvent". Untuk mempelajari lebih lanjut tentang operator rxjs, silakan kunjungi: rxjs
Gabungkan kedua aliran ini untuk menerima pengamatan kami:
Sekarang Anda dapat berlangganan seperti ini:
Ingatlah untuk berhenti berlangganan :)
sumber
Ada layanan ViewportRuler di CDK sudut. Ini berjalan di luar zona, dan bekerja dengan rendering sisi server juga.
sumber
Berdasarkan solusi dari @cgatian saya akan menyarankan penyederhanaan berikut:
Pemakaian:
sumber
Ini bukan jawaban yang tepat untuk pertanyaan tersebut tetapi dapat membantu seseorang yang perlu mendeteksi perubahan ukuran pada elemen apa pun.
Saya telah membuat perpustakaan yang menambahkan
resized
acara ke elemen apa pun - Angular Resize Event .Ini digunakan secara internal
ResizeSensor
dari Query Elemen CSS .Contoh penggunaan
HTML
TypeScript
sumber
Saya menulis lib ini untuk menemukan perubahan ukuran batas komponen sekali (ukuran) di Angular, semoga ini membantu orang lain. Anda dapat meletakkannya di komponen root, akan melakukan hal yang sama seperti mengubah ukuran jendela.
Langkah 1: Impor modul
Langkah 2: Tambahkan arahan seperti di bawah ini
<simple-component boundSensor></simple-component>
Langkah 3: Menerima detail ukuran batas
sumber
Pada Angular2 (2.1.0) saya menggunakan ngZone untuk menangkap acara perubahan layar.
Lihatlah contohnya:
Semoga bantuan ini!
sumber
Kode di bawah ini memungkinkan mengamati perubahan ukuran untuk div yang diberikan di Angular
kemudian di Komponen:
sumber
semua solusi tidak bekerja dengan sisi-server atau universal angular
sumber
Saya memeriksa sebagian besar jawaban ini. kemudian memutuskan untuk memeriksa dokumentasi Angular tentang Tata Letak .
Angular memiliki Pengamat sendiri untuk mendeteksi ukuran yang berbeda dan mudah diterapkan ke dalam komponen atau Layanan.
contoh sederhana adalah:
semoga membantu
sumber