Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS在理解克隆对象和引用分配时遇到困难_Javascript_Angularjs - Fatal编程技术网

Javascript AngularJS在理解克隆对象和引用分配时遇到困难

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()更

我在AngularJS 1.6中遇到了问题 有一些困惑。 我正在迭代一个名为
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