2016-07-29 19 views
2

プロパティnameageのオブジェクトの配列を持っています。配列の名前はpersonです。元の配列が更新されるが、そのままコンポーネントビューが残っ角の2つのビューは配列の変更で更新されません

this.person[0].name = "godfather";

問題として、私は、配列の要素のプロパティを更新するときです。私は角度変化の検出が変更としてアレイ内の更新を考慮しないという問題を発見しました。だから、私は(配列への参照を変更)の文の下に試してみました:

this.person = this.person.slice(); 

私はちょうど知ってほしい、後で声明に良い練習を使用するか、上記の問題に対処するためのいくつかのより良いアプローチはありますか。

答えて

1

それはこのslice()操作のコストに依存します。それが小さな配列の場合は何の害もないかもしれませんが、大きな配列の場合はパフォーマンス上の問題が顕著になるかもしれません。この場合、レシーバに変更を積極的に通知するオブザーバブルを使用する方が良い方法です。

+1

もっと良い解決策は何でしょうか? – mishap

+1

「IterableDiffer」https://github.com/angular/angular/blob/14ee75924b6ae770115f7f260d720efa8bfb576a/modules/%40angular/common/src/directives/ng_for.ts#L111などの観測可能なものもあれば、それ以外のものもあります。具体的なユースケースに依存します。 –

0

あなたのアプローチは、すべてではない一部のJS実装で動作するsliceの不特定の使用です。 私は成功を収めてこれを使用しています

this.person = JSON.parse(JSON.stringify(this.person)); 
+0

これはコンパスソンではかなり高額に見えます。 'slice()'がうまく動作しないかもしれない場所についての情報を提供するリンクがありますか? –

+1

JSONのアプローチはより高価です。しかし、それがUIでのみ使用され、ループやタイムクリティカルなコードで使用されていない場合は、問題はありません。仕様によると、スライスには少なくとも1つのパラメータが必要です。パラメーターなしで呼び出すことは指定されていません。 – hholtij

+0

ちょうど 'スライス(0)'は私が同様に推測するでしょうか? –

関連する問題