自定义窗体控件的值可以使用窗体组的 patchValue 方法更新,但不会重置



我们的表单与如此多的组件(自定义表单控件)解耦。 我有一个组件来添加多个值,此组件用作表单控件。此表单控件可以通过以下方式更新

this.formGroup.patchValue();

但不能清空其值,

this.formGroup.reset();

这是 plunker 中的代码 https://plnkr.co/edit/Xd3b0f8q0hn4eiNha367?p=preview我的问题是,由于"valueOfMultipleSelector: Array"是子组件的一部分,那么如何使用this.formGroup.patchValue()从父组件更新其值?

这是因为JavaScript对象是可变的。数组在 JavaScript 中也"只是"对象,我作为旁注提到这一点,因为我们在这里处理数组。

这是什么意思呢?简而言之,multipleValuesList是对foodWePrefer的引用。因此,无论这些数组中的任何一个发生什么,都会影响另一个。这就是为什么当您在父级中使用patchValue()时,您的孩子会自动"更新"的原因。

可变性可以通过子组件中的@Input轻松证明。如果将对象从父项传递到子项,则无需在子项中具有@Output即可更新父项!另一方面,如果你有一个不可变的字符串(以及其他基元类型),你的父母将不知道你在 child 中所做的更改。这是演示展示这一点。

记住JS对象是可变的很重要,因为它可能会导致不需要的行为,而实际上不希望另一个变量在更改另一个变量时受到影响。也许您实际上不希望在修改子对象时父项受到影响?

在这种情况下,您确实需要这种行为。

您说form.reset()不会重置子表单,它确实如此,当您单击重置按钮时,您可以看到foodWePrefer变为 null,这正是我们期望从form.reset()

但是你的意思是,这些项目不会从孩子的 DOM 中删除。

为什么?

这是因为这些项目存储在不同的数组中,即valueOfMultipleSelector.这个数组既没有引用foodWePrefer也没有引用multipleValuesList,所以当后两个数组中的任何一个发生更改时,它当然不会影响valueOfMultipleSelector数组。

希望您理解我试图解释的内容,并且您更好地了解代码中发生的事情:)

最新更新