@@ -37,19 +37,39 @@ 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+ * @override
57+ */
58+ dispose ( ) {
59+ const tracks = this . options_ . tracks ;
60+
61+ tracks . removeEventListener ( 'removetrack' , this . updateHandler_ ) ;
62+ tracks . removeEventListener ( 'addtrack' , this . updateHandler_ ) ;
63+ tracks . removeEventListener ( 'labelchange' , this . updateHandler_ ) ;
64+
65+ this . player_ . off ( 'ready' , this . updateHandler_ ) ;
66+ this . player_ . off ( 'dispose' , this . disposeHandler_ ) ;
67+
68+ delete this . updateHandler_ ;
69+ delete this . disposeHandler_ ;
70+
71+ super . dispose ( ) ;
72+ }
5373}
5474
5575Component . registerComponent ( 'TrackButton' , TrackButton ) ;
0 commit comments