我在表单对象'question1'中有一个名称为parentForm的表单控件,并且已经通过以下方式进行了订阅。

它是带有两个选项YesNo的单选按钮,当我选择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,而不是我的要求。

最佳答案

valueChanges是可观察的,因此您可以通过管道传递pairwise来获取订阅中的上一个和下一个值。

// No initial value. Will emit only after second character entered
this.form.get('fieldName')
  .valueChanges
  .pipe(pairwise())
  .subscribe(([prev, next]: [any, any]) => ... );
// Fill buffer with initial value, and it will emit immediately on value change
this.form.get('fieldName')
  .valueChanges
  .pipe(startWith(null), pairwise())
  .subscribe(([prev, next]: [any, any]) => ... );

在StackBlitz中工作的示例:
https://stackblitz.com/edit/angular-reactive-forms-vhtxua

关于angular - 表单控件的valueChanges给出先前的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44898010/

10-11 14:59