Вот функция, которую вы можете привязать к событию (change)
вашего input
:
processInput(inputVal: string = null) {
if (!inputVal) {
inputVal = this.myForm.get('myInput').value; // since you're using reactive forms
}
if (inputVal === '') {
// Do nothing
} else if (inputVal.match(/^\d*$/)) {
if (!inputVal.includes('+')) {
inputVal = '+' + inputVal;
}
}
// Then patch your 'myInput' value in your form with 'inputVal'
this.myForm.patchValue({ 'myInput': inputVal });
}
safePatchMyInput(value: string) {
this.processInput(value);
}
Эта реализация добавит знак плюс, если (и только если) входная строка содержит только цифры. Это также позволяет полностью очистить ввод (включая знак плюс).
Редактировать: Добавление метода safePatchMyInput
позволит вам вручную пропатчить этот вход и по-прежнему использовать ту же обработку ввода из предыдущей функции. (Это означает добавление параметра по умолчанию к предыдущей функции)
Привязка к событию (change)
на вашем входе выглядит просто так:
<input (change)="processInput()"/>
Редактировать 2
Это обновленное решение, которое работает с FormControl.registerOnChange
для обработки ввода, даже если оно было установлено вручную с помощью patchValue
.
Угловой компонент:
myForm: FormGroup;
constructor() {
this.myForm = new FormGroup({
'myInput': new FormControl('')
})
}
ngOnInit() {
const myInput = this.myForm.get('myInput') as FormControl;
myInput.registerOnChange(this.processInput);
}
processInput = () => {
let inputVal = this.myForm.get('myInput').value;
if (inputVal === '') {
// Do nothing
} else if (inputVal.match(/^\d*$/)) {
if (!inputVal.includes('+')) {
inputVal = '+' + inputVal;
// Then patch your 'myInput' value in your form with 'inputVal'
this.myForm.patchValue({ 'myInput': inputVal });
}
}
}
HTML-шаблон:
<form [formGroup]="myForm">
<input formControlName="myInput" (input)="processInput()"/>
</form>
Stackblitz, для справки.