@@ -37,19 +37,37 @@ class TrackButton extends MenuButton {
3737 }
3838
3939 const updateHandler = Fn . bind_ ( this , this . update ) ;
40+ const disposeHandler = Fn . bind_ ( this , this . dispose ) ;
41+
42+ // keep references to the event handlers so subclasses / callers can remove listeners if they dispose the component
43+ this . updateHandler_ = updateHandler ;
44+ this . disposeHandler_ = disposeHandler ;
4045
4146 tracks . addEventListener ( 'removetrack' , updateHandler ) ;
4247 tracks . addEventListener ( 'addtrack' , updateHandler ) ;
4348 tracks . addEventListener ( 'labelchange' , updateHandler ) ;
4449 this . player_ . on ( 'ready' , updateHandler ) ;
45-
46- this . player_ . on ( 'dispose' , function ( ) {
47- tracks . removeEventListener ( 'removetrack' , updateHandler ) ;
48- tracks . removeEventListener ( 'addtrack' , updateHandler ) ;
49- tracks . removeEventListener ( 'labelchange' , updateHandler ) ;
50- } ) ;
50+ this . player_ . on ( 'dispose' , disposeHandler ) ;
5151 }
5252
53+ /**
54+ * Dispose of the Component and remove all event listeners
55+ */
56+ dispose ( ) {
57+ const tracks = this . options_ . tracks ;
58+
59+ tracks . removeEventListener ( 'removetrack' , this . updateHandler_ ) ;
60+ tracks . removeEventListener ( 'addtrack' , this . updateHandler_ ) ;
61+ tracks . removeEventListener ( 'labelchange' , this . updateHandler_ ) ;
62+
63+ this . player_ . off ( 'ready' , this . updateHandler_ ) ;
64+ this . player_ . off ( 'dispose' , this . disposeHandler_ ) ;
65+
66+ delete this . updateHandler_ ;
67+ delete this . disposeHandler_ ;
68+
69+ super . dispose ( ) ;
70+ }
5371}
5472
5573Component . registerComponent ( 'TrackButton' , TrackButton ) ;
0 commit comments