173 votes

Détection des changements de taille de fenêtre en temps réel dans Angular 4

J'ai essayé de créer une barre de navigation réactive et je ne souhaite pas utiliser une requête multimédia. *ngIf avec la taille de la fenêtre comme critère. Mais j'ai été confronté à un problème car je suis incapable de trouver une méthode ou une documentation sur la détection de la taille de la fenêtre dans Angular 4. J'ai également essayé la méthode JavaScript, mais elle n'est pas prise en charge.

J'ai également essayé le suivant :

constructor(platform: Platform) {
    platform.ready().then((readySource) => {
        console.log('Width: ' + platform.width());
        console.log('Height: ' + platform.height());
    });
}

...qui a été utilisé en ionique.

Et screen.availHeight mais toujours pas de succès.

1 votes

Qu'est-ce que platform sur ? C'est à propos de Ionic ?

0 votes

@Günter Zöchbauer La plateforme est angulaire, je voulais juste mentionner les codes que j'avais essayés.

1 votes

Platform est un service Ionic. Donc je suppose que c'est un projet Ionic ?

399voto

Eduardo Vargas Points 2376

Pour l'obtenir sur init

public innerWidth: any;
ngOnInit() {
    this.innerWidth = window.innerWidth;
}

Si vous voulez le garder à jour sur le redimensionnement :

@HostListener('window:resize', ['$event'])
onResize(event) {
  this.innerWidth = window.innerWidth;
}

5 votes

This.innerWidth = event.target.innerWidth ; ... est peut-être plus efficace, mais produit le même résultat

3 votes

Recommandez également ceci dans le constructeur si vous utilisez lodash ... this.onResize = debounce(this.onResize, 150, {leading : false, trailing : true}) ... pour éviter que la méthode onResize ne soit appelée trop fréquemment ... vous devrez ... importer { debounce } de 'lodash'.

0 votes

Je pense qu'il est préférable d'utiliser ngAfterViewInit méthode du crochet de vie au lieu de ngOnInit méthode du crochet de sauvetage

64voto

Jeremy Benks Points 776

Si vous voulez réagir à certains points d'arrêt (par exemple, faire quelque chose si la largeur est de 768px ou moins), vous pouvez utiliser la fonction BreakpointObserver :

import { Component } from '@angular/core';
import { BreakpointObserver, BreakpointState } from '@angular/cdk/layout';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {

  constructor(
    private breakpointObserver: BreakpointObserver,
  ) {
    // detect screen size changes
    this.breakpointObserver.observe([
      "(max-width: 768px)"
    ]).subscribe((result: BreakpointState) => {
      if (result.matches) {
          // hide stuff        
      } else {
          // show stuff
      }
    });
  }
}

0 votes

Si vous voulez agir seulement si l'observateur correspond à des critères, vous devez ajouter à l'intérieur de subscribe ceci if (result.matches) sinon il appellera même si ce n'est pas le cas.

1 votes

@karoluS : Oui, bien sûr. J'ai modifié ma réponse pour que cela soit clair. Merci.

0 votes

Il semble que ce cdk dépend d'une version spécifique d'Angular. Comme 7 pour la dernière version. De toute façon, je peux l'utiliser pour une version plus ancienne (angular 4 comme dans la question) ?

13voto

Kildareflare Points 623

Si vous souhaitez que vos composants restent facilement testables, vous devez envelopper l'objet fenêtre global dans un service Angular :

import { Injectable } from '@angular/core';

@Injectable()
export class WindowService {

  get windowRef() {
    return window;
  }

}

Vous pouvez ensuite l'injecter comme n'importe quel autre service :

constructor(
    private windowService: WindowService
) { }

Et consommer...

  ngOnInit() {
      const width= this.windowService.windowRef.innerWidth;
  }

5 votes

Je ne vois pas l'intérêt de faire un service pour faire exactement ce qui est déjà à portée de main. window.innerWidth.

7 votes

Tout d'abord, DI est la méthode Angular et rend les dépendances d'un composant / directive plus claires. Mais le point principal mentionné ici est de rendre le code qui utilise le service plus facile à tester. En utilisant cette approche, le WindowService peut être simulé dans tout test écrit pour les composants qui utilisent le service.

11voto

robbannn Points 3098

La documentation pour Platform width() y height() il est précisé que ces méthodes utilisent window.innerWidth y window.innerHeight respectivement. Mais l'utilisation de ces méthodes est préférable car les dimensions sont des valeurs mises en cache, ce qui réduit les risques de lectures multiples et coûteuses du DOM.

import { Platform } from 'ionic-angular';

...
private width:number;
private height:number;

constructor(private platform: Platform){
    platform.ready().then(() => {
        this.width = platform.width();
        this.height = platform.height();
    });
}

0 votes

Comment le fait d'obtenir width de window se rapportent à DOM ? Logiquement, cela ne devrait pas dépendre de l'aspect de l'arbre de dom.

5voto

Vous pouvez utiliser ce https://github.com/ManuCutillas/ng2-responsive J'espère que cela vous aidera :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X