fe7b041cedf02097366c5cfe2caf73371b0bc143
[sdc/sdc-workflow-designer.git] /
1 /**
2  * @license
3  * Copyright Google Inc. All Rights Reserved.
4  *
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
7  */
8 /* tslint:disable:array-type member-access variable-name typedef
9  only-arrow-functions directive-class-suffix component-class-suffix
10  component-selector*/
11 import {Directive, ElementRef, NgZone, OnDestroy, OnInit, Renderer2} from '@angular/core';
12 import {Observable} from 'rxjs/Observable';
13 import {Subject} from 'rxjs/Subject';
14
15 import {ScrollDispatcher} from './scroll-dispatcher';
16
17
18 /**
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.
22  */
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;
27
28   constructor(
29                 private _elementRef: ElementRef, private _scroll: ScrollDispatcher,
30                 private _ngZone: NgZone, private _renderer: Renderer2) {}
31
32   ngOnInit() {
33         this._scrollListener = this._ngZone.runOutsideAngular(() => {
34                 return this._renderer.listen(
35                         this.getElementRef().nativeElement, 'scroll', (event: Event) => {
36                         this._elementScrolled.next(event);
37                         });
38         });
39
40         this._scroll.register(this);
41   }
42
43   ngOnDestroy() {
44         this._scroll.deregister(this);
45
46         if (this._scrollListener) {
47                 this._scrollListener();
48                 this._scrollListener = null;
49         }
50   }
51
52   /**
53    * Returns observable that emits when a scroll event is fired on the host
54    * element.
55    */
56   elementScrolled(): Observable<any> {
57         return this._elementScrolled.asObservable();
58   }
59
60   getElementRef(): ElementRef {
61         return this._elementRef;
62   }
63 }