Gostaria de executar algumas tarefas com base no evento de redimensionamento da janela (no carregamento e dinamicamente).
Atualmente, tenho o meu DOM da seguinte maneira:
<div id="Harbour">
<div id="Port" (window:resize)="onResize($event)" >
<router-outlet></router-outlet>
</div>
</div>
O evento é acionado corretamente
export class AppComponent {
onResize(event) {
console.log(event);
}
}
Como recupero a largura e a altura desse objeto de evento?
Obrigado.
javascript
angular
DanAbdn
fonte
fonte
innerHeight
einnerWidth
propriedades ..console.log(event.target.innerWidth )
Respostas:
ou usando o decorador HostListener :
Metas globais suportados são
window
,document
ebody
.Até que https://github.com/angular/angular/issues/13248 seja implementado no Angular, é melhor para o desempenho inscrever-se imperativamente nos eventos DOM e usar o RXJS para reduzir a quantidade de eventos, conforme mostrado em algumas das outras respostas.
fonte
document
,window
ebody
github.com/angular/angular/blob/…import { Component, OnInit, HostListener } from '@angular/core';
A resposta de @ Günter está correta. Eu só queria propor outro método.
Você também pode adicionar a ligação ao host dentro do
@Component()
-decorator. Você pode colocar o evento e a chamada de função desejada na propriedade host-metadata-property da seguinte forma:fonte
window.innerWidth
interiorngOnInit
, oungAfterViewInit
métodos?Eu sei que isso foi perguntado há muito tempo, mas existe uma maneira melhor de fazer isso agora! Não tenho certeza se alguém verá esta resposta. Obviamente suas importações:
Então no seu componente:
Não se esqueça de cancelar a inscrição em destruir!
fonte
import { fromEvent, Observable,Subscription } from "rxjs";
this.resizeSubscription$ = this.resizeObservable$.pipe(debounceTime(1000)).subscribe( evt => { console.log('event: ', evt) })
A maneira correta de fazer isso é utilizar a classe EventManager para vincular o evento. Isso permite que seu código funcione em plataformas alternativas, por exemplo, renderização no lado do servidor com o Angular Universal.
O uso em um componente é tão simples quanto adicionar esse serviço como provedor ao seu app.module e depois importá-lo no construtor de um componente.
fonte
window
objeto, assim como um servidor não possui umwindow
. Im não estão familiarizados com as diferentes configurações móveis, mas você deve ser capaz de se adaptar facilmente o código acima para se ligar ao correta ouvinte evento globalMobile does not have a window object
.... por que você acha que os navegadores móveis não têm um objeto de janela?Aqui está uma maneira melhor de fazer isso. Baseado na resposta de Birowsky .
Etapa 1: Crie um
angular service
com o RxJS Observables .Etapa 2: injete o que foi dito acima
service
e assine qualquer um dosObservables
criados no serviço onde quer que você queira receber o evento de redimensionamento da janela.Um bom entendimento da Programação Reativa sempre ajudará a superar problemas difíceis. Espero que isso ajude alguém.
fonte
Eu não vi ninguém falando sobre
MediaMatcher
deangular/cdk
.Você pode definir um MediaQuery e anexar um ouvinte a ele. Em qualquer lugar do seu modelo (ou ts), você pode invocar coisas se o Matcher corresponder. LiveExample
App.Component.ts
App.Component.Html
App.Component.css
fonte: https://material.angular.io/components/sidenav/overview
fonte
Supondo que <600px significa móvel para você, você pode usar este observável e assinar:
Primeiro, precisamos do tamanho atual da janela. Então criamos um observável que emite apenas um único valor: o tamanho atual da janela.
Então precisamos criar outro observável, para que possamos saber quando o tamanho da janela foi alterado. Para isso, podemos usar o operador "fromEvent". Para saber mais sobre os operadores do rxjs, visite: rxjs
Mescla esses dois fluxos para receber nosso observável:
Agora você pode se inscrever assim:
Lembre-se de cancelar a inscrição :)
fonte
Há um serviço ViewportRuler no CDK angular. Ele roda fora da zona e também funciona com a renderização no servidor.
fonte
Com base na solução do @cgatian, sugiro a seguinte simplificação:
Uso:
fonte
Esta não é exatamente a resposta para a pergunta, mas pode ajudar alguém que precisa detectar alterações de tamanho em qualquer elemento.
Eu criei uma biblioteca que adiciona
resized
evento a qualquer elemento - Angular Resize Event .Ele usa internamente a
ResizeSensor
partir de consultas de elemento CSS .Exemplo de uso
HTML
TypeScript
fonte
Eu escrevi esta biblioteca para encontrar uma vez que a alteração do tamanho do limite do componente (redimensionamento) no Angular, pode ajudar outras pessoas. Você pode colocá-lo no componente raiz, fará o mesmo que redimensionar a janela.
Etapa 1: Importar o Módulo
Etapa 2: adicione a diretiva como abaixo
<simple-component boundSensor></simple-component>
Etapa 3: receber os detalhes do tamanho do limite
fonte
No Angular2 (2.1.0), uso o ngZone para capturar o evento de alteração de tela.
Veja o exemplo:
Espero que isso ajude!
fonte
O código abaixo permite observar qualquer alteração de tamanho para qualquer div em Angular.
depois no componente:
fonte
todas as soluções não estão funcionando no lado do servidor ou no modo universal angular
fonte
Eu verifiquei a maioria dessas respostas. Decidiu então verificar a documentação do Angular no Layout .
O Angular possui seu próprio Observador para detectar tamanhos diferentes e é fácil de implementar no componente ou em um Serviço.
um exemplo simples seria:
espero que ajude
fonte