Angular2,Data也保持绑定到函数内部的原始变量

YAS*_*AVE 3 arrays data-binding angular

我正在调用一个函数来复制*ngFor循环中的数据,如下所示.

<li (click)="replicateTicket(data);">&nbsp; Replicate</li>
Run Code Online (Sandbox Code Playgroud)

在函数内部,我正在更新变量的名称和ID,并将其推送到数组中.(在给出的例子中,我没有推动数据更生动地解释行为.

replicateTicket(data:any){
          data.name = data.name + ' (Replicated)';
          console.log(this.ticketList[this.ticketList.length-1].id);
          data.id = 0;
          console.log(this.ticketList[this.ticketList.length-1].id);
}
Run Code Online (Sandbox Code Playgroud)

我想要的是如果原始数据的id是5而不是它不应该变为0.

  1. 运行plunker

  2. 点击458 abc.

  3. 它应该只更新新数据而不是当前数据.

难道我做错了什么?

Ste*_*ota 5

您需要创建当前对象的副本,更改它然后将新对象推送到数组中,例如:(我使用了Plunker中的代码)

replicateTicket(ticket:any){
    let t = JSON.parse(JSON.stringify(ticket));
    t.name += ' (Replicated)';
    t.id = 0;
    this.ticketList.push(t);
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@ stefan-svrkota.这工作:p (2认同)
  • @YASHDAVE这不是一个bug,你在Plunker中所做的是以下内容:你每次都引用相同的对象并一遍又一遍地将它推到一个数组中,这就是为什么所有这些都被改变的原因 - 所有元素都是数组基本上是你最初创建的对象的一个​​实例,但是`let t = JSON.parse(JSON.stringify(ticket));`每次都创建一个对象的副本. (2认同)
  • @YASHDAVE` let t = ticket`应该不起作用,因为你将对象`ticket`的引用分配给变量`t`,而`let t = JSON.parse(JSON.stringify(ticket));`创建对象的副本`ticket`并将其存储在变量`t`中. (2认同)