私は*ngFor
のパフォーマンスを最適化しようとしているときにのみtrackBy
関数が使用されているという印象を受けました。何か変更があった場合、DOMを再構築する必要はありません。角度2 - trackBy関数、実際に何をしていますか?
しかし、最近、私はtrackBy
が実際に間違った動作を修正したという状況に遭遇しました。
例えばこれを持っ:最初*ngFor
にtrackBy:customTrackBy
:私は明示的にこの部分を定義する必要がありました
<div>
<h2>Hobbies</h2>
<div *ngFor="let h of user.hobbies; trackBy:customTrackBy; let i = index">
#{{i}} - {{h | json}}<br />
<input [(ngModel)]="h.name" name="hobby_name_{{i}}" /> <br /><br />
<select [(ngModel)]="h.type_id" name="type_{{i}}">
<option *ngFor="let t of types" [value]="t.id">{{t.type}}</option>
</select>
<br />
<br />
<button class="btn btn-warn" (click)="remove(i)">Remove</button>
<br /><br />
</div>
</div>
:趣味セクション、特にHTMLのhttps://plnkr.co/edit/nRgdwoiKAMpsbmWaoMoj?p=preview フォーカス。 trackBy
が除去され、次の手順を実行している場合:
- することは、この場合、新しいアイテム
を追加し、最初の項目の入力が内容に置き換えます
trackBy
がこの問題を解決しますが、なぜですか?
私は本当にどんな種類の説明にも感謝します。このような質問をするのが適切でない場合は、正しいものにリダイレクトしてください。ありがとう。
更新
はここで間違った行動の例です:https://plnkr.co/edit/u8YajKfHcPiVqY0WcJt7?p=preview(BFが得る最初のアイテム(サイクリング)を削除し、新しい項目を追加(ボタンを追加)し、両方の値が同じデフォルト値を取得する方法を見ますモデルが正しいままであっても「デフォルト値」に置き換えられます)。
要するに、配列を突然変異させるとき、角度は、項目が追加、削除、または移動されたかどうかを知る必要があります。 Trackbyは、角度を使ってデータモデル内のアイテムを見つけ出し、何が起きたのかを推測するのに役立ちます。これは、domに1つの項目を追加しただけで配列全体を再描画しないようにするためです。 –