11import {
2- Directive , ElementRef , HostListener , HostBinding ,
3- EventEmitter , Input , Output , OnDestroy , AfterViewInit ,
4- Renderer2 , ChangeDetectorRef
2+ Directive , ElementRef , HostBinding , EventEmitter ,
3+ Input , Output , OnDestroy , AfterViewInit ,
4+ ChangeDetectorRef , NgZone
55} from '@angular/core' ;
6+ import { Observable } from 'rxjs/Observable' ;
67import { Subject } from 'rxjs/Subject' ;
8+ import { fromEvent } from 'rxjs/observable/fromEvent' ;
9+ import 'rxjs/add/operator/auditTime' ;
710import 'rxjs/add/operator/debounceTime' ;
811import 'rxjs/add/operator/takeUntil' ;
12+ import 'rxjs/add/observable/merge' ;
913
1014import { WindowRef } from '../window/window.service' ;
1115import { Viewport } from '../shared/viewport.model' ;
@@ -123,13 +127,16 @@ export class InViewportDirective implements AfterViewInit, OnDestroy {
123127 /**
124128 * Creates an instance of InViewportDirective.
125129 * @param {ElementRef } el
130+ * @param {WindowRef } win
131+ * @param {ChangeDetectorRef } cdRef
132+ * @param {NgZone } ngZone
126133 * @memberof InViewportDirective
127134 */
128135 constructor (
129136 private el : ElementRef ,
130- private renderer : Renderer2 ,
131137 private win : WindowRef ,
132- private cdRef : ChangeDetectorRef
138+ private cdRef : ChangeDetectorRef ,
139+ private ngZone : NgZone
133140 ) { }
134141 /**
135142 * Subscribe to `viewport$` observable which
@@ -146,8 +153,22 @@ export class InViewportDirective implements AfterViewInit, OnDestroy {
146153 . debounceTime ( this . debounce )
147154 . subscribe ( ( ) => this . calculateInViewportStatus ( ) ) ;
148155
156+ // Listen for window scroll/resize events.
157+ this . ngZone . runOutsideAngular ( ( ) => {
158+ Observable . merge (
159+ fromEvent ( this . win as any , eventData . eventWindowResize ) ,
160+ fromEvent ( this . win as any , eventData . eventWindowScroll )
161+ )
162+ . auditTime ( this . debounce )
163+ . subscribe ( ( ) => this . onViewportChange ( ) ) ;
164+ } ) ;
165+
149166 if ( this . parentEl ) {
150- this . renderer . listen ( this . parentEl , eventData . eventScroll , this . onParentScroll . bind ( this ) ) ;
167+ this . ngZone . runOutsideAngular ( ( ) => {
168+ fromEvent ( this . parentEl , eventData . eventScroll )
169+ . auditTime ( this . debounce )
170+ . subscribe ( ( ) => this . onParentScroll ( ) ) ;
171+ } ) ;
151172 }
152173 }
153174 /**
@@ -165,16 +186,13 @@ export class InViewportDirective implements AfterViewInit, OnDestroy {
165186 *
166187 * @memberof InViewportDirective
167188 */
168- @HostListener ( eventData . eventWindowScroll )
169- @HostListener ( eventData . eventWindowResize )
170189 public onViewportChange ( ) : void {
171190 this . viewport$ . next ( ) ;
172191 }
173192 /**
174193 * Calculate inViewport status and emit event
175194 * when viewport status has changed
176195 *
177- * @param {Viewport } viewport
178196 * @memberof InViewportDirective
179197 */
180198 public calculateInViewportStatus ( ) : void {
@@ -194,7 +212,7 @@ export class InViewportDirective implements AfterViewInit, OnDestroy {
194212 this . inViewport = ( inParentViewport && inWindowViewport ) ;
195213
196214 if ( oldInViewport !== this . inViewport ) {
197- this . onInViewportChange . emit ( this . inViewport ) ;
215+ this . ngZone . run ( ( ) => this . onInViewportChange . emit ( this . inViewport ) ) ;
198216 }
199217 }
200218 /**
0 commit comments