2017-04-08 11 views
3

以下のように* ngForループ内のデータを複製する関数を呼び出しています。Angular2、データは関数内の元の変数にもバインドされています

<li (click)="replicateTicket(data);">&nbsp; Replicate</li> 

この関数の中で、変数の名前と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); 
} 

は何がしたいこと、それはに変更するべきではありませんよりも、元のデータのidが5の場合は0です。

  1. 458 ABCの

    実行plunker

  2. クリック。

  3. これは、新しいデータのみではなく、現在の1を更新する必要があります。

何か間違っていますか?

+1

にも当てはまります。 – niravpatel9898

答えて

5

あなたは、現在のオブジェクトのコピーを作成し、それを変更して、配列に新しいオブジェクトをプッシュし、例えばこのような何かする必要があります(私はあなたのPlunkerからコードを使用)

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

ありがとう@ stefan-svrkota。それはうまくいった:p –

+1

しかし、私はこの動作を理解していない、これはバグですか? –

+2

@YASHDAVEこれはバグではなく、Plunkerで何をしているのかは次のようなものです:毎回同じオブジェクトを参照して何度も配列にプッシュしているので、すべてが変更されています基本的に最初に作成したオブジェクトと同じインスタンスですが、 'let t = JSON.parse(JSON.stringify(ticket));は毎回オブジェクトのコピーを作成します。 –

0

あなたも行うことができますこの

replicateTicket(ticket:any){ 
      let a = Object.assign({}, ticket); 
      a.name = ticket.name + ' (Replicated)'; 
      a.id = 0; 
      this.ticketList.push(a); 
     } 
関連する問題