@@ -18,7 +18,7 @@ import {
18
18
Output ,
19
19
SkipSelf ,
20
20
} from '@angular/core' ;
21
- import { Observable , of as observableOf , Subject , Subscription , Observer } from 'rxjs' ;
21
+ import { Observable , of as observableOf , Subject , Subscription } from 'rxjs' ;
22
22
import { coerceElement } from '@angular/cdk/coercion' ;
23
23
24
24
@@ -41,8 +41,7 @@ export interface FocusOptions {
41
41
type MonitoredElementInfo = {
42
42
unlisten : Function ,
43
43
checkChildren : boolean ,
44
- subject : Subject < FocusOrigin > ,
45
- observable : Observable < FocusOrigin >
44
+ subject : Subject < FocusOrigin >
46
45
} ;
47
46
48
47
/**
@@ -170,30 +169,17 @@ export class FocusMonitor implements OnDestroy {
170
169
}
171
170
172
171
// Create monitored element info.
173
- const subject = new Subject < FocusOrigin > ( ) ;
174
- const info : MonitoredElementInfo = {
172
+ let info : MonitoredElementInfo = {
175
173
unlisten : ( ) => { } ,
176
- checkChildren,
177
- subject,
178
- // Note that we want the observable to emit inside the NgZone, however we don't want to
179
- // trigger change detection if nobody has subscribed to it. We do so by creating the
180
- // observable manually.
181
- observable : new Observable ( ( observer : Observer < FocusOrigin > ) => {
182
- const subscription = subject . subscribe ( origin => {
183
- this . _ngZone . run ( ( ) => observer . next ( origin ) ) ;
184
- } ) ;
185
-
186
- return ( ) => {
187
- subscription . unsubscribe ( ) ;
188
- } ;
189
- } )
174
+ checkChildren : checkChildren ,
175
+ subject : new Subject < FocusOrigin > ( )
190
176
} ;
191
177
this . _elementInfo . set ( nativeElement , info ) ;
192
178
this . _incrementMonitoredElementCount ( ) ;
193
179
194
180
// Start listening. We need to listen in capture phase since focus events don't bubble.
195
- const focusListener = ( event : FocusEvent ) => this . _onFocus ( event , nativeElement ) ;
196
- const blurListener = ( event : FocusEvent ) => this . _onBlur ( event , nativeElement ) ;
181
+ let focusListener = ( event : FocusEvent ) => this . _onFocus ( event , nativeElement ) ;
182
+ let blurListener = ( event : FocusEvent ) => this . _onBlur ( event , nativeElement ) ;
197
183
this . _ngZone . runOutsideAngular ( ( ) => {
198
184
nativeElement . addEventListener ( 'focus' , focusListener , true ) ;
199
185
nativeElement . addEventListener ( 'blur' , blurListener , true ) ;
@@ -205,7 +191,7 @@ export class FocusMonitor implements OnDestroy {
205
191
nativeElement . removeEventListener ( 'blur' , blurListener , true ) ;
206
192
} ;
207
193
208
- return info . observable ;
194
+ return info . subject . asObservable ( ) ;
209
195
}
210
196
211
197
/**
@@ -372,7 +358,7 @@ export class FocusMonitor implements OnDestroy {
372
358
}
373
359
374
360
this . _setClasses ( element , origin ) ;
375
- elementInfo . subject . next ( origin ) ;
361
+ this . _emitOrigin ( elementInfo . subject , origin ) ;
376
362
this . _lastFocusOrigin = origin ;
377
363
}
378
364
@@ -392,7 +378,11 @@ export class FocusMonitor implements OnDestroy {
392
378
}
393
379
394
380
this . _setClasses ( element ) ;
395
- elementInfo . subject . next ( null ) ;
381
+ this . _emitOrigin ( elementInfo . subject , null ) ;
382
+ }
383
+
384
+ private _emitOrigin ( subject : Subject < FocusOrigin > , origin : FocusOrigin ) {
385
+ this . _ngZone . run ( ( ) => subject . next ( origin ) ) ;
396
386
}
397
387
398
388
private _incrementMonitoredElementCount ( ) {
0 commit comments