2016-09-02 2 views
12

私のコンポーネントのいくつかの機能は、ブラウザのサイズに応じてオンまたはオフになるため、サイズ変更イベントでブラウザの幅を確認する必要がありますが、On Initメソッドを使用して行うことはできますが、ブラウザの幅を更新するためにブラウザをリフレッシュする必要があります。角度2でウィンドウのサイズを即座に検出できるのはどうですか?

ngOnInit() { 
    if (window.innerWidth <= 767){ 
     ---- do something 
     } 
    } 

は、しかし、私はこの方法をOnChanges使用しようとしたが、それは動作しません。どちらか

OnChanges(changes:SimpleChanges){ 
console.log('width:====>' + changes[window.innerWidth].currentValue); 
    if (changes[window.innerWidth].currentValue <= 767){ 
     ---- do something 
} 

}

は、これを達成する任意の提案や別の方法はありますか?

答えて

18

あなただけwindowオブジェクト上resizeイベントにハンドラを置くことができるが、これは、あなたが、onresizeの最新登録されたイベントが動作する唯一の単一resizeイベントを置くことができます。それはより多くの角度の道窓のresizeに(HostListnerデコレータがマウントされた)あなたのサイズ変更機能を呼び出すことができるようになる、あなたのコンポーネント内@HostListener('window:resize')を使用するようにするに

constructor(private ngZone:NgZone) { 
    window.onresize = (e) => 
    { 
     //ngZone.run will help to run change detection 
     this.ngZone.run(() => { 
      console.log("Width: " + window.innerWidth); 
      console.log("Height: " + window.innerHeight); 
     }); 
    }; 
} 

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

これは1つのコンポーネントで機能しますが、別のコンポーネントに追加すると機能しません。私は、onresizeイベントが既に定義されているためだと思います。 – Sam

+1

'onresize'イベントを1回だけウィンドウに登録できます。' onresize'イベントを登録しようとすると、古いイベントは破棄されます。 –

+1

はい、ありがとうございます。私はホストリスナーのソリューションに行きました。複数のサイズ変更イベント(各コンポーネントに1つ)が許可されていました。そして、より角度のある方法で動作しています。 – Sam

3

あなたが検出したいHTMLブロックにリサイズメソッドを使用することでしょう簡単な方法:

<div class="some-class" (window:resize)="onResize($event)">...</div> 

次に、あなただけ追加することができ、あなたの.tsファイルに:

onResize(event) { 

    const innerWidth = event.target.innerWidth; 
    console.log(innerWidth); 

    if (innerWidth <= 767) { 
     ...do something 
    } 
} 

ページの読み込み時にウィンドウサイズを必要としない限り、の外側にngOnInit() {}を追加します。あなたは、ウィンドウのサイズを変更すると

は、あなたが console.log

11

使用HostListenerが表示されます。あなたはおそらく何かをする前にサイズ変更のイベントをデバウンスする必要があります、それはユーザーがウィンドウのサイズをドラッグする数ミリ秒の数十倍になる可能性があるサイズ変更のたびに発生します。

import { Component, HostListener } from '@angular/core'; 

@Component({...}) 
class TestComponent { 
    @HostListener('window:resize') 
    onWindowResize() { 
     //debounce resize, wait for resize to finish before doing stuff 
     if (this.resizeTimeout) { 
      clearTimeout(this.resizeTimeout); 
     } 
     this.resizeTimeout = setTimeout((() => { 
      console.log('Resize complete'); 
     }).bind(this), 500); 
    } 
} 
+1

すごくうれしくありがとう!角度5で動作します。 – JREAM

関連する問題