2017-02-24 99 views
6

在我的其中一个页面上,我使用FormBuilder在初始化时填写表单。每当输入为而不是为空时,每个输入都会得到一个类。这是通过将ngClass添加到每个输入并订购FormGroupvalueChanges来完成的。如何以编程方式触发`valueChanges`?

每当通过编程填充表单时,就会出现我的问题。每当用户更改表单上的任何值时,valueChanges被调用,但是,使用FormBuilder时情况并非如此。

我的问题是:如何在FormBuilder完成时获取valueChanges事件。

我试过使用this.FormGroup.updateValueAndValidity(),但是这并没有产生任何结果。

回答

3

我找到了一个适合我的解决方案。我忘记了updateValueAndValidity函数中的两个参数。

  • onlySelf:只会更新此FormControl为true。
  • emiteEvent:将导致valueChanges事件在正确时被触发。

因此,作为结果,你会得到这样的: FormGroup.updateValueAndValidity({ onlySelf: false, emitEvent: true });

2

的标题和你的问题的描述是有些误导。这是什么? (i)

  • 是否要以编程方式更改字段的有效性状态?
  • 或者,您是否想要确保您订阅的字段valueChanges在以编程方式更改其值时被调用?

不管怎么说,看看这个Plunkr:https://plnkr.co/edit/4V4PUFI1D15ZDWBfm2hb?p=preview

你会看到,当您以编程方式设置字段的值是这样的:

this.myForm.get('myField').setValue(newValue); 

无论是有效性和valueChanges观察到的字段被更新。因此,它看起来像你试图重新创建一个已经存在的行为。

然而,编程改变其值时,场的属性dirty不更新(如per the doc:“A控制是脏如果用户在UI改变了值”)。可能是因为您正在检查dirty属性以指示现场错误,并且您有错觉有效性状态未更新,实际上它只是dirty属性未更新?

(i)这两件事情是不同的。您不应订阅valueChanges手动触发验证。验证应通过在表单模型中声明验证器来实施。

+0

我同意你的观点,我的问题颇具误导性,所以我花时间重写了问题和答案。我曾尝试'markAsDirty'的'setValue'选项,但是,这并没有解决我的问题。 – Max

+1

谢谢Max。但是如果你[查看'setValue()']的源代码(https://github.com/angular/angular/blob/master/modules/%40angular/forms/src/model.ts#L674)会发现它已经调用'updateValueAndValidity()'。此外,'emitEvent'参数默认设置为'true'。换句话说,默认行为应该已经给你所有你想要的东西。也许你没有使用正确的语法来以编程方式更改字段的值? – AngularChef

+0

我公司的consisteny政策要求我使用FormBuilder来初始化表单的内容,所以我被要求使用FormBuilder。如果我只是使用'FormGroup.updateValueAndValidity()'而不提供参数,则表单不会使我需要的方式失效。但是,如果我提供参数,我确实得到了我需要的结果。 – Max

相关问题