@@ -308,24 +308,7 @@ export class MatInput
308308 // exists on iOS, we only bother to install the listener on iOS.
309309 if ( _platform . IOS ) {
310310 ngZone . runOutsideAngular ( ( ) => {
311- _elementRef . nativeElement . addEventListener ( 'keyup' , ( event : Event ) => {
312- const el = event . target as HTMLInputElement ;
313-
314- // Note: We specifically check for 0, rather than `!el.selectionStart`, because the two
315- // indicate different things. If the value is 0, it means that the caret is at the start
316- // of the input, whereas a value of `null` means that the input doesn't support
317- // manipulating the selection range. Inputs that don't support setting the selection range
318- // will throw an error so we want to avoid calling `setSelectionRange` on them. See:
319- // https://html.spec.whatwg.org/multipage/input.html#do-not-apply
320- if ( ! el . value && el . selectionStart === 0 && el . selectionEnd === 0 ) {
321- // Note: Just setting `0, 0` doesn't fix the issue. Setting
322- // `1, 1` fixes it for the first time that you type text and
323- // then hold delete. Toggling to `1, 1` and then back to
324- // `0, 0` seems to completely fix it.
325- el . setSelectionRange ( 1 , 1 ) ;
326- el . setSelectionRange ( 0 , 0 ) ;
327- }
328- } ) ;
311+ _elementRef . nativeElement . addEventListener ( 'keyup' , this . _iOSKeyupListener ) ;
329312 } ) ;
330313 }
331314
@@ -360,6 +343,10 @@ export class MatInput
360343 if ( this . _platform . isBrowser ) {
361344 this . _autofillMonitor . stopMonitoring ( this . _elementRef . nativeElement ) ;
362345 }
346+
347+ if ( this . _platform . IOS ) {
348+ this . _elementRef . nativeElement . removeEventListener ( 'keyup' , this . _iOSKeyupListener ) ;
349+ }
363350 }
364351
365352 ngDoCheck ( ) {
@@ -519,4 +506,23 @@ export class MatInput
519506 const element = this . _elementRef . nativeElement as HTMLSelectElement ;
520507 return this . _isNativeSelect && ( element . multiple || element . size > 1 ) ;
521508 }
509+
510+ private _iOSKeyupListener = ( event : Event ) : void => {
511+ const el = event . target as HTMLInputElement ;
512+
513+ // Note: We specifically check for 0, rather than `!el.selectionStart`, because the two
514+ // indicate different things. If the value is 0, it means that the caret is at the start
515+ // of the input, whereas a value of `null` means that the input doesn't support
516+ // manipulating the selection range. Inputs that don't support setting the selection range
517+ // will throw an error so we want to avoid calling `setSelectionRange` on them. See:
518+ // https://html.spec.whatwg.org/multipage/input.html#do-not-apply
519+ if ( ! el . value && el . selectionStart === 0 && el . selectionEnd === 0 ) {
520+ // Note: Just setting `0, 0` doesn't fix the issue. Setting
521+ // `1, 1` fixes it for the first time that you type text and
522+ // then hold delete. Toggling to `1, 1` and then back to
523+ // `0, 0` seems to completely fix it.
524+ el . setSelectionRange ( 1 , 1 ) ;
525+ el . setSelectionRange ( 0 , 0 ) ;
526+ }
527+ } ;
522528}
0 commit comments