提问人:Johannes Stricker 提问时间:2/1/2018 更新时间:7/24/2020 访问量:5398
如何按值将对象传递到 Angular2+ 组件中
How to pass object by value into Angular2+ component
问:
假设我有一个组件,它接受一个实例并显示一个表单来编辑它。Foo
export class ChildComponent implements OnInit {
@Input() foo : Foo;
@Output() onChange : EventEmitter<Foo> = new EvenEmitter<Foo>();
constructor() {
}
ngOnInit() {
}
}
我把它嵌套在一个 .ChildComponent
ParentComponent
<div id="parent">
<app-child-component [foo]="parentFoo"></app-child-component>
</div>
现在,即使我在这里使用了单向绑定,因为是一个对象,因此通过引用传递,因此对它所做的任何更改也会反映在 中。foo
ChildComponent
ParentComponent
我怎样才能防止这种情况发生?有没有办法通过价值传递?有什么最佳实践吗?
答:
正如 Gunter 在以下回答中所说: Angular2:通过引用传递组件之间的交互
基元值(字符串、num、布尔值、对象引用)按值传递(复制),对象和数组按引用传递(两个组件都获得对同一对象实例的引用)。
这与 Angular 无关,这只是 Javascript 以及 Typescript 的工作方式。
事实上,我想说的是,如果你将一个对象传递到一个子组件中,并试图在那里更改它,你就是在更新同一个对象,所以在某种程度上,它有点“好”,使值保持同步。
但是,如果要分叉值,则需要以一种或另一种方式创建本地副本。如注释中所述,您可以通过在子组件中对对象进行深度复制,然后更改该值来做到这一点。下面是一个小的 Stackblitz 示例来说明此方法: https://stackblitz.com/edit/angular-axr5zf。
评论
setter()
getter()
@Input
@Input
好吧,到目前为止,我最好的解决方案是这样的:
export class ChildComponent implements OnInit {
private _foo : Foo;
@Input()
set foo(value : Foo) { this._foo = Object.create(value || null); }
get foo() : Foo { return this._foo; }
@Output() onChange : EventEmitter<Foo> = new EventEmitter<Foo>();
constructor() {
}
ngOnInit() {
}
}
这似乎确实有效,但是单个属性需要大量代码。我仍然不明白为什么 Angular 中没有内置这样的功能(例如装饰器)。@InputByValue
我认为,当我希望更改从子项反射回父项时,我会使用双向绑定。我在这里遗漏了什么吗?有什么理由不去做我想做的事情吗?[(foo)]="foo"
你可以试试 const copy = { ...原文 } 用于创建对象的副本
您需要生成一个新对象,而不是直接使用输入引用。一个快速的解决方案是使用 Spread 语法生成对象的新副本,并在模板中使用它。
@Input('foo') fooRef : Foo;
foo: Foo;
.
.
.
ngOnInit() {
// creating a new object using the spread syntax
this.foo = {...this.fooRef};
}
评论
上一个:向量添加函数参数
评论