2016-02-20 14 views
25

Cercando di capire come ottenere la larghezza della finestra sul ridimensionamento degli eventi in Angular2. Qui è il mio codice:Angular2 ottiene la larghezza della finestra onResize

export class SideNav { 

    innerWidth: number; 

    constructor(private window: Window){ 

     let getWindow = function(){ 
      return window.innerWidth; 
     }; 

     window.onresize = function() { 
      this.innerWidth = getWindow(); 
      console.log(getWindow()); 
     }; 
} 

Sto importando fornitore finestra a livello globale nel file bootstrap.ts usando fornire per ottenere l'accesso in tutta la mia app per finestra. Il problema che sto avendo è che mi dà una dimensione della finestra, ma sul ridimensionamento della finestra - ripete semplicemente la stessa dimensione più e più volte anche se la finestra cambia dimensione. Vedi immagine per esempio console.log: Screenshot image

Il mio obiettivo generale è quello di essere in grado di impostare il numero di finestra per un onResize variabile in modo che io possa avere accesso ad esso nel modello. Qualche idea su cosa sto facendo male qui?

Grazie!

risposta

51
<div (window:resize)="onResize($event)" 
onResize(event) { 
    event.target.innerWidth; 
} 

a ricevere la notifica sugli eventi di scorrimento su un elemento figlio in un modello di componenti

o ascoltare sull'elemento ospite componenti si

@HostListener('window:resize', ['$event']) 
onResize(event) { 
    event.target.innerWidth; 
} 
+0

perché ha fatto commenta @Hostlistener? Per me funziona solo senza le barre di commento, ma poi funziona perfettamente :-) –

+1

È inteso come un modo alternativo. Puoi aggiungerlo a un elemento nel modello come mostrato nel primo codice tagliato o usare un '@HostListener()' per ascoltare sull'elemento host dei componenti stesso. Ho aggiornato la mia risposta per renderla più chiara. –

7

In questo caso è necessario eseguire il rilevamento delle modifiche manualmente. Mentre modifichi la variabile componente dal contesto esterno di Angular, l'evento di ridimensionamento in pratica non ottiene patch scimmia dal sistema di rilevamento modifiche Angular2.

Codice

import {ChangeDetectorRef} from 'angular2/core' 

export class SideNav { 
    innerWidth: number; 

    constructor(private window: Window, private cdr: ChangeDetectorRef){ 

     let getWindow =() => { 
      return window.innerWidth; 
     }; 

     window.onresize =() => { 
      this.innerWidth = getWindow(); 
      this.cdr.detectChanges(); //running change detection manually 
     }; 
    } 
} 

Piuttosto vorrei suggerire di andare per this answer, dall'aspetto più pulito

+1

questo è stato interessante per conoscere le modifiche apportate - ma sono stato davvero contento che tu mi abbia indicato la soluzione Observable - Sono stato in grado di aggiungere un nuovo servizio per la larghezza e l'altezza della finestra in un modo pulito e riutilizzabile - quindi grazie tanto! –

19

Usa NgZone per innescare il cambiamento di rilevamento:

constructor(ngZone:NgZone) { 
    window.onresize = (e) => 
    { 
     ngZone.run(() => { 
      this.width = window.innerWidth; 
      this.height = window.innerHeight; 
     }); 
    }; 
} 
+0

idea interessante con ngZone - dovrò provarlo! Attualmente utilizza un'implementazione osservabile per rilevare automaticamente le modifiche. –

Problemi correlati