Angular 组件输入中传递的值更改父级

Angular 组件输入中传递的值更改父级,angular,Angular,据我所知,组件中的输入字段应该是单向的(父到子)。但是,我将一个值传递到输入,然后在组件中修改它,但是我注意到它在父级中也发生了变化。这对我来说是有意义的,因为对象是通过引用传递的,但我猜这意味着整个“单向绑定”只是一个范例,而不是严格的?Angular在引擎盖下没有强制执行单向绑定吗 基本上,我在做: <session-form [values]="session"></session-form> 在会话窗体组件中,我将会话.start从unixtimestamp

据我所知,组件中的
输入
字段应该是单向的(父到子)。但是,我将一个值传递到
输入
,然后在组件中修改它,但是我注意到它在父级中也发生了变化。这对我来说是有意义的,因为对象是通过引用传递的,但我猜这意味着整个“单向绑定”只是一个范例,而不是严格的?Angular在引擎盖下没有强制执行单向绑定吗

基本上,我在做:

<session-form [values]="session"></session-form>

会话窗体
组件中,我将
会话.start
从unixtimestamp更改为矩对象。但是我注意到在父对象中,
session.start
也是一个力矩对象


有这样的数据使用范例吗?设置后,是否应将输入值复制到严格限定为组件范围的变量?

是的,对象通过引用传递。但是,您不应该使用
[(ngModel)]
将对象的属性绑定到表单,因为它是双向绑定的,并且由于对象是通过引用传递的,所以它也反映了父组件内部对它的更改。相反,您应该创建一个
FormGroup
,并使用
FormBuilder.group()
函数将对象值传递给它,因为它是单向的

// Inside of your child component
@Input() myInput: SomeClass;

form: FormGroup

constructor(
    private formBuilder: FormBuilder
) { }    

ngOnInit(): void {
    this.form = this.formBuilder.group({
        prop1: [this.myInput.prop1],
        // etc.
    });
}
查看smart/dumb(容器/表示)组件体系结构

基本上,智能组件包含应用程序的状态,或者与包含该状态的服务进行对话。哑组件只是呈现@Input中提供给它的数据。智能组件将状态传递给哑组件

使用事件发射器通知智能组件更新数据,而不是直接更新哑组件中的数据。这样您就拥有了单向数据流

更多信息请点击此处:

如上所述,我没有使用双向绑定。我对
[value]
使用了一种方法。另外,我在组件中使用了FormGroup,但我还需要修改数据,以便在表单外部使用。@我知道您正在使用
[value]
单向传递输入,但正如您所说,它引用了一个对象,如果您在子组件中使用双向绑定来绑定它的任何属性,它将反映到父组件
FormGroup
阻止您这样做。如果需要在窗体外部的子组件内部进行双向绑定,则需要自己进行。例如,在名为
private prop1:string的组件中创建一个变量
和内部
ngOnInit
将对象中的值分配给该变量
this.prop1=myObj.prop1
,现在可以绑定它2-way@RhoVisions我假设您正在使用子组件内部的
[(ngModel)]
将该数据绑定到表单外部:在我的组件中,我正在修改通过
[value]
(将时间戳转换为时刻对象)传入的数据,我需要这些数据在子组件中显示。即使是单向的,我看到父组件的值也会变为矩对象,这从引用POV来看是有意义的,但我没有意识到单向绑定会发生这种情况。我从来没有使用过双向绑定;我使用的是所有的动态形式,我的观点是,你直接改变了一个对象的属性,正如你自己说的,对象是通过引用传递的。您应该首先将对象属性存储到单独的变量中,修改它,然后使用该变量而不是对象属性。谢谢您提供的信息。这是一种有趣的方法,尽管在本例中,我更希望保持组件完全分离;它基本上是将接收到的数据格式化为它喜欢的格式。我看不出要求家长为其格式化数据有什么意义。如果只是格式化,您可能会使用日期管道:。或者构建一个定制的管道来完成当前的工作。现在仍然是这样,还是不更新其父级数据?因为它没有为我更新家长,我不知道我是否做错了什么,或者它是否改变了