Идея состоит в том, чтобы "сохранить" последнее состояние вашей формы в свойстве, которое вы будете обновлять при каждом обновлении формы:
public formSave = null;
...
ngAfterViewInit() {
if (!this.formSave) {
setTimeout(() => {
this.formSave = this.myForm.value;
});
}
this.myForm.valueChanges.subscribe(newVal => {
console.log('changes', newVal);
this.formSave = {...this.formSave, ...newVal};
});
}
Некоторые объяснения:
{...this.formSave, ...newVal}
(называемый spread operator
) принимает исходное сохраненное значение формы (с вашим отключенным значением в случае, если оно было отключено) и объединяет новое значение, возвращаемое потоком valueChanges
.
Почему setTimeout()
? Просто избегать ExpressionChangedAfterItHasBeenCheckedError
, так как мы модифицируем свойство класса в ловушке жизненного цикла . Поэтому для запуска новой проверки цикла я помещаю инициализацию свойства в это утверждение. Но вы также можете исправить это с помощью ChangeDetectorRef (но это не так c).
Поскольку возвращаются только разрешенные значения, оно не меняет значения (s). ) отключенных полей.
Вот ваше рабочее приложение StackBlitz