Javascript AngularJS在理解克隆对象和引用分配时遇到困难
我在AngularJS 1.6中遇到了问题 有一些困惑。 我正在迭代一个名为Javascript AngularJS在理解克隆对象和引用分配时遇到困难,javascript,angularjs,Javascript,Angularjs,我在AngularJS 1.6中遇到了问题 有一些困惑。 我正在迭代一个名为aList的对象数组,其中包含HTML部分中的可变对象 <div ng-repeat="item in aList> <a ng-click = "updateDataFun(item)">Click</a> </div> 现在,在模态上,我有这样的东西 如果我通过modal更改了任何内容(名称,updateData的一个属性),然后按cancelUpdate()更
aList
的对象数组,其中包含HTML部分中的可变对象
<div ng-repeat="item in aList>
<a ng-click = "updateDataFun(item)">Click</a>
</div>
现在,在模态上,我有这样的东西
如果我通过modal更改了任何内容(名称,updateData的一个属性),然后按cancelUpdate()
更改将反映到aList
数组中
以下是一些问题:
updateDataFun(item)
方法中,赋值为引用赋值(假定)。我说得对吗?因此,如果我通过modal更改this.updateData
,它将反映项
。另外,更改与项目关联的列表
索引值李>
cancelUpdate()
时,this.updateData
将是{}
为什么这不反映项
?它应该是{}
但是,如果我取消注释this.updateData=Object.assign({},item)代码>和注释
this.updateData=item代码>然后它开始工作。javascript通过引用而不是通过值传递对象
所以这一行是你的问题:
this.updateData = item;
此行通过引用传递项,因此您对该变量所做的所有更改都将影响源列表项。
建议的解决方案是复制对象,而不是通过引用传递
像这样:
this.updateData = JSON.parse(JSON.stringify(item)); // create new item in the memory and assign it to updateData variable
您可以使用您想要的任何其他克隆方法
或者仅使用所需的值创建新对象
编辑
很抱歉没有回答你的问题
如前所述,你是对的
当你写作时
变量={}
意思是你不改变变量的引用为空对象,
将新(空)对象指定给变量(而不是对象的引用)
希望它的帮助正如yaron所建议的,您认为this.updateData
引用了列表
中的单个项是正确的。因此,当您在任何地方更改this.updateData
的属性时(即使在模态中,如果模态也接收到引用),它也会反映到列表中
但是,在cancelUpdate()
中,指定一个空对象来代替该引用(将项
引用替换为对其他项的引用)。对项
的引用被中断,因此从那时起的任何更改(包括分配空对象)都不会反映出来。如果要将{}
分配给项
,则必须直接更新列表或直接修改项
对象(不重新分配)
this.updateData=Object.assign({},item)
将该项克隆到一个全新的对象,并将其引用存储到this.updateData
,因此任何更改都不会再次反映到item
@Claies,Tnx。我改了。
this.updateData = JSON.parse(JSON.stringify(item)); // create new item in the memory and assign it to updateData variable