@@ -44,7 +44,6 @@ import {
44
44
combineLatest as combineLatestOp ,
45
45
distinctUntilChanged ,
46
46
filter ,
47
- first ,
48
47
flatMap ,
49
48
map ,
50
49
publish ,
@@ -236,15 +235,24 @@ export class YouTubePlayer implements AfterViewInit, OnDestroy, OnInit {
236
235
}
237
236
238
237
createEventsBoundInZone ( ) : YT . Events {
239
- return {
240
- onReady : this . _runInZone ( ( event ) => this . ready . emit ( event ) ) ,
241
- onStateChange : this . _runInZone ( ( event ) => this . stateChange . emit ( event ) ) ,
242
- onPlaybackQualityChange :
243
- this . _runInZone ( ( event ) => this . playbackQualityChange . emit ( event ) ) ,
244
- onPlaybackRateChange : this . _runInZone ( ( event ) => this . playbackRateChange . emit ( event ) ) ,
245
- onError : this . _runInZone ( ( event ) => this . error . emit ( event ) ) ,
246
- onApiChange : this . _runInZone ( ( event ) => this . apiChange . emit ( event ) ) ,
247
- } ;
238
+ const output : YT . Events = { } ;
239
+ const events = new Map < keyof YT . Events , EventEmitter < any > > ( [
240
+ [ 'onReady' , this . ready ] ,
241
+ [ 'onStateChange' , this . stateChange ] ,
242
+ [ 'onPlaybackQualityChange' , this . playbackQualityChange ] ,
243
+ [ 'onPlaybackRateChange' , this . playbackRateChange ] ,
244
+ [ 'onError' , this . error ] ,
245
+ [ 'onApiChange' , this . apiChange ]
246
+ ] ) ;
247
+
248
+ events . forEach ( ( emitter , name ) => {
249
+ // Since these events all trigger change detection, only bind them if something is subscribed.
250
+ if ( emitter . observers . length ) {
251
+ output [ name ] = this . _runInZone ( event => emitter . emit ( event ) ) ;
252
+ }
253
+ } ) ;
254
+
255
+ return output ;
248
256
}
249
257
250
258
ngAfterViewInit ( ) {
@@ -261,9 +269,7 @@ export class YouTubePlayer implements AfterViewInit, OnDestroy, OnInit {
261
269
262
270
private _runInZone < T extends ( ...args : any [ ] ) => void > ( callback : T ) :
263
271
( ...args : Parameters < T > ) => void {
264
- return ( ...args : Parameters < T > ) => {
265
- this . _ngZone . run ( ( ) => callback ( ...args ) ) ;
266
- } ;
272
+ return ( ...args : Parameters < T > ) => this . _ngZone . run ( ( ) => callback ( ...args ) ) ;
267
273
}
268
274
269
275
/** Proxied methods. */
@@ -416,19 +422,18 @@ function bindSuggestedQualityToPlayer(
416
422
* Returns an observable that emits the loaded player once it's ready. Certain properties/methods
417
423
* won't be available until the iframe finishes loading.
418
424
*/
419
- function waitUntilReady ( )
420
- : OperatorFunction < UninitializedPlayer | undefined , Player | undefined > {
425
+ function waitUntilReady ( ) : OperatorFunction < UninitializedPlayer | undefined , Player | undefined > {
421
426
return flatMap ( player => {
422
- if ( ! player ) {
423
- return observableOf < Player | undefined > ( undefined ) ;
424
- }
425
- if ( 'getPlayerStatus' in player ) {
426
- return observableOf ( player as Player ) ;
427
- }
428
- // The player is not initialized fully until the ready is called.
429
- return fromPlayerOnReady ( player )
430
- . pipe ( first ( ) , startWith ( undefined ) ) ;
431
- } ) ;
427
+ if ( ! player ) {
428
+ return observableOf < Player | undefined > ( undefined ) ;
429
+ }
430
+ if ( 'getPlayerStatus' in player ) {
431
+ return observableOf ( player as Player ) ;
432
+ }
433
+ // The player is not initialized fully until the ready is called.
434
+ return fromPlayerOnReady ( player )
435
+ . pipe ( take ( 1 ) , startWith ( undefined ) ) ;
436
+ } ) ;
432
437
}
433
438
434
439
/** Since removeEventListener is not on Player when it's initialized, we can't use fromEvent. */
0 commit comments