我们的表单与如此多的组件(自定义表单控件)解耦。 我有一个组件来添加多个值,此组件用作表单控件。此表单控件可以通过以下方式更新
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
数组。
希望您理解我试图解释的内容,并且您更好地了解代码中发生的事情:)