Angular 角度2禁用的控件不包含在form.value中

Angular 角度2禁用的控件不包含在form.value中,angular,angular2-forms,Angular,Angular2 Forms,我注意到,如果我在Angular 2被动窗体上禁用控件,则该控件不会包含在form.value中。例如,如果我像下面这样定义我的表单: this.notelinkingForm = new FormGroup({ Enabled: new FormControl(settings.Enabled, Validators.required), LinkToPreceeding: new FormControl({value: settings.LinkToPreceeding, d

我注意到,如果我在Angular 2被动窗体上禁用控件,则该控件不会包含在form.value中。例如,如果我像下面这样定义我的表单:

this.notelinkingForm = new FormGroup({
    Enabled: new FormControl(settings.Enabled, Validators.required),
    LinkToPreceeding: new FormControl({value: settings.LinkToPreceeding, disabled: !settings.Enabled}, Validators.required),
    LinkingTolerance: new FormControl({value: settings.LinkingTolerance, disabled: !settings.Enabled}, Validators.required)
});
并检查this.notelinkingForm.value,如果所有控件均已启用,则输出将为:

{"Enabled":true, "LinkToPreceeding": true, LinkingTolerance:"100"} 
{"Enabled":true} 
但是,当某些控件被禁用时,它将是:

{"Enabled":true, "LinkToPreceeding": true, LinkingTolerance:"100"} 
{"Enabled":true} 
请注意如何排除禁用的控件

我的意图是,当表单发生更改时,我希望能够将form.value及其所有属性传递给rest API。如果它不包含已禁用的项,则显然无法执行此操作

我是否遗漏了什么,或者这是预期的行为?有没有办法告诉Angular在form.value中包含禁用的项

欢迎您的想法。

您可以使用:

this.notelinkingForm.getRawValue()
发件人:

如果希望包括所有值,而不考虑禁用状态,请使用此方法。否则,
value
属性是获取组值的最佳方法


我使用的另一个选项是:

this.form.controls['LinkToPreceeding'].value

谢谢你给我80%的所需

对于那些正在寻找解决同一问题的方法,但对于嵌套表单,我可以通过改变我通常的方法来解决

this.notelinkingForm.get('nestedForm').value


如果使用
readonly
而不是
disabled
,当数据将包含在表单中时,它仍然不可编辑。但这并非在所有情况下都是可能的。例如,单选按钮和复选框不可用。看见在这种情况下,您必须申请此处提供的其他解决方案。

想知道Angular团队究竟为什么这么做this@inorganik他们这样做是因为可以启用禁用的控件并编辑其值。在本例中,getRawValue()将返回一个具有篡改值的对象。这实际上是一件好事。例如,我知道禁用控件的值不会更改,因此我不想将它们包含在save API中,因为我首先从数据库中为这些控件分配了一个值。但在某些情况下,我确实希望包括那些从前端分配值的控件,它们不存储在DB中,这个函数涵盖了它。两个选项都有总是好的。这是真的@ChiragMS。我喜欢这方面,只要我可以在
只读
禁用
之间进行选择。但我在下面的回答中描述的复选框和单选按钮并非如此。在这些情况下,我不喜欢以不同的方式获取数据,并专门为这种情况编写代码。因为有人可能会篡改它,所以“删除”值是毫无意义的。永远不要信任客户端数据。您应该总是期望有人篡改您的数据,并在服务器端重新检查它。这只是另一个令人烦恼的问题。此外,即使使用getRawValue(),Angular 11也不包括禁用的值。