6
6
* found in the LICENSE file at https://angular.io/license
7
7
*/
8
8
9
- import { Directive , ElementRef , OnInit , OnDestroy , NgZone } from '@angular/core' ;
10
- import { Observable , Subject } from 'rxjs' ;
9
+ import { Directive , ElementRef , NgZone , OnDestroy , OnInit } from '@angular/core' ;
10
+ import { fromEvent , Observable , Subject } from 'rxjs' ;
11
+ import { takeUntil } from 'rxjs/operators' ;
11
12
import { ScrollDispatcher } from './scroll-dispatcher' ;
12
13
13
14
@@ -20,36 +21,32 @@ import {ScrollDispatcher} from './scroll-dispatcher';
20
21
selector : '[cdk-scrollable], [cdkScrollable]'
21
22
} )
22
23
export class CdkScrollable implements OnInit , OnDestroy {
23
- private _elementScrolled : Subject < Event > = new Subject ( ) ;
24
- private _scrollListener = ( event : Event ) => this . _elementScrolled . next ( event ) ;
24
+ private _destroyed = new Subject ( ) ;
25
+
26
+ private _elementScrolled : Observable < Event > = Observable . create ( observer =>
27
+ this . _ngZone . runOutsideAngular ( ( ) =>
28
+ fromEvent ( this . _elementRef . nativeElement , 'scroll' ) . pipe ( takeUntil ( this . _destroyed ) )
29
+ . subscribe ( observer ) ) ) ;
25
30
26
31
constructor ( private _elementRef : ElementRef ,
27
32
private _scroll : ScrollDispatcher ,
28
33
private _ngZone : NgZone ) { }
29
34
30
35
ngOnInit ( ) {
31
- this . _ngZone . runOutsideAngular ( ( ) => {
32
- this . getElementRef ( ) . nativeElement . addEventListener ( 'scroll' , this . _scrollListener ) ;
33
- } ) ;
34
-
35
36
this . _scroll . register ( this ) ;
36
37
}
37
38
38
39
ngOnDestroy ( ) {
39
40
this . _scroll . deregister ( this ) ;
40
-
41
- if ( this . _scrollListener ) {
42
- this . getElementRef ( ) . nativeElement . removeEventListener ( 'scroll' , this . _scrollListener ) ;
43
- }
44
-
45
- this . _elementScrolled . complete ( ) ;
41
+ this . _destroyed . next ( ) ;
42
+ this . _destroyed . complete ( ) ;
46
43
}
47
44
48
45
/**
49
46
* Returns observable that emits when a scroll event is fired on the host element.
50
47
*/
51
- elementScrolled ( ) : Observable < any > {
52
- return this . _elementScrolled . asObservable ( ) ;
48
+ elementScrolled ( ) : Observable < Event > {
49
+ return this . _elementScrolled ;
53
50
}
54
51
55
52
getElementRef ( ) : ElementRef {
0 commit comments