У меня есть элемент управления формой для выбора какого-то значения (например - пол) и пары <input type="radio">
. Требования следующие:
- Когда пользователь изменяет ввод, мне нужно показать модальное окно, которое просит его подтвердить или отменить изменения (без каких-либо действий).
- Мне нужно показывать модальное окно только в том случае, если пользователь меняет входное значение с одного пола на другой.
Моя проблема в том, что FormControl имеет только valueChanges событие, которое генерирует после значение уже было изменено. И мне нужно программно установить предыдущее значение:
this.genderControl.setValue(GenderEnum.MALE, {emitEvent: false});
Пример псевдокода:
компонент. html
<input
formControlName="gender"
type="radio"
value="female"
id="female"
/>
<input
formControlName="gender"
type="radio"
value="male"
id="male"
/>
<input
formControlName="gender"
type="radio"
value="other"
id="other"
/>
component.ts
this.genderControl.valueChanges
.pipe(
distinctUntilChanged(),
startWith(null),
pairwise(),
takeUntil(this._destroy$)
).subscribe(([prev, next]: [GenderEnum, GenderEnum]) => {
this.openWarningModal().afterClosed().subscribe((selectedAction: CommonModalsActionsEnum) => {
if (selectedAction === CommonModalsActionsEnum.CONFIRM) {
this.handleChangeGender(next);
}
if (selectedAction === CommonModalsActionsEnum.CLOSE) {
this.genderControl.setValue(prev, {emitEvent: false});
}
});
});
Возможное решение может заключаться в удалении FormControl с использованием ngModel и подписки на нажатие на ввод событие. Таким образом, обработчик кликов показывает модальное окно и изменяет или не меняет переменную, относящуюся к ngModel.
Но я надеюсь, что существует более ясное решение!