Форма управления 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 через значение свойства