3 * Copyright Google Inc. All Rights Reserved.
5 * Use of this source code is governed by an MIT-style license that can be
6 * found in the LICENSE file at https://angular.io/license
8 /* tslint:disable:array-type member-access variable-name typedef
9 only-arrow-functions directive-class-suffix component-class-suffix
11 import {Directive, ElementRef, NgZone, OnDestroy, OnInit, Renderer2} from '@angular/core';
12 import {Observable} from 'rxjs/Observable';
13 import {Subject} from 'rxjs/Subject';
15 import {ScrollDispatcher} from './scroll-dispatcher';
19 * Sends an event when the directive's element is scrolled. Registers itself
20 * with the ScrollDispatcher service to include itself as part of its collection
21 * of scrolling events that it can be listened to through the service.
23 @Directive({selector: '[cdk-scrollable], [cdkScrollable]'})
24 export class Scrollable implements OnInit, OnDestroy {
25 private _elementScrolled: Subject<Event> = new Subject();
26 private _scrollListener: Function|null;
29 private _elementRef: ElementRef, private _scroll: ScrollDispatcher,
30 private _ngZone: NgZone, private _renderer: Renderer2) {}
33 this._scrollListener = this._ngZone.runOutsideAngular(() => {
34 return this._renderer.listen(
35 this.getElementRef().nativeElement, 'scroll', (event: Event) => {
36 this._elementScrolled.next(event);
40 this._scroll.register(this);
44 this._scroll.deregister(this);
46 if (this._scrollListener) {
47 this._scrollListener();
48 this._scrollListener = null;
53 * Returns observable that emits when a scroll event is fired on the host
56 elementScrolled(): Observable<any> {
57 return this._elementScrolled.asObservable();
60 getElementRef(): ElementRef {
61 return this._elementRef;