Форма управления valueChanges дает Предыдущее значение
у меня есть элемент управления формой с именем 'question1'
внутри объекта форма parentForm
и я подписался на него следующим образом.
его переключатель с двумя вариантами Yes
и No
, когда я выберите No
Я Yes
и когда я выберите Yes
его No
.
this.parentForm.controls['question1'].valueChanges.subscribe(
(selectedValue) => {
// If option `No is selected`
console.log(selectedValue); // displays No. OK
console.log(this.parentForm.value['question1']); // displays Yes. Problem is here
}
);
selectedValue
переменная имеет правильное значение, но если я делаю console.log(this.parentForm.value['question1']
это дает Предыдущее значение.
я попытался поставитьsetTimeout()
перед извлечением значения из this.parentForm.value['question1']
, он просто отлично работает.
setTimeout(() => {
console.log(this.parentForm.value['question1']); // gives the correct value.
}, 500);
но мой вопрос в том, почему parentForm
не обновляется, когда изменяется значение его элемента управления, и это тоже я получаю его значение только после изменения значения.
примечание: Я не хочу наблюдать за parentForm.valueChanges
, а не мое требование.
3 ответов
на valueChanges
событие после новое значение обновляется до FormControl
значением, и до изменение пузырится до своего родителя и предков. Поэтому вам нужно будет получить доступ к значению FormControl
сам (который только что был исправлен), а не поле FormGroup
объект value (который не затрагивается во время события).
в свете этого, используйте this.parentForm.get('question1').value
вместо:
this.parentForm.controls['question1'].valueChanges.subscribe(
(selectedValue) => {
console.log(selectedValue);
console.log(this.parentForm.get('question1').value);
}
);
есть еще один вариант, но он может не подходить во всех случаях: вы можете подождать один тик до selectedValue
обновляется в FormControl:
setTimeout( () => console.log( selectedValue ) );
подробнее о sync / async forms тема:реактивные формы в угловых направляющих документах.
попробуйте сделать это
this.parentForm.controls['question1'].valueChanges.subscribe(
(selectedValue) => {
console.log(selectedValue);
console.log(this.parentForm.value.question1);
}
);
если элементы управления FormBuilder были обновлены, вы можете немедленно восстановить последние значения из объекта FormBuilder через значение свойства