Я бы создал пользовательскую реализацию ControlValueAccessor. Последнее соответствовало бы директиве, которая будет прослушивать входное событие хоста. Таким образом, вы сможете ввести в верхний регистр то, что вы заполняете пользователем. Элемент управления будет автоматически содержать значение в верхнем регистре.
Вот реализация:
@Directive ({
selector: 'input[uppercase]',
// When the user updates the input
host: { '(input)': 'onChange($event.target.value.toUpperCase())' }
})
export class UppercaseValueAccessor extends DefaultValueAccessor {
(...)
// When the code updates the value of the
// property bound to the input
writeValue(value:any):void {
if (value!=null) {
super.writeValue(value.toUpperCase());
}
}
}
Не забудьте зарегистрировать этот пользовательский атрибут значения в поставщиках директив. Таким образом ваш пользовательский атрибут значения будет использоваться вместо стандартного.
const UPPERCASE_VALUE_ACCESSOR = new Provider(NG_VALUE_ACCESSOR, { useExisting: forwardRef(() => UppercaseValueAccessor), multi: true});
@Directive ({
providers: [ UPPERCASE_VALUE_ACCESSOR ],
(...)
})
export class UppercaseValueAccessor ...
И добавьте директиву в атрибут директивы компонента, в котором вы хотите использовать этот подход.
См. Этот класс для более подробной информации:
Эта ссылка может давать дополнительные подсказки (см. раздел «Компонент, совместимый с NgModel»):