-
Posted by akai on 2020-01-28T15:17:03.903Z *ngForディレクティブでのtrackByオプションに対して、以下のような理解を持っています。
しかし、IDを持たないなどの理由で、回すデータを一意に特定する方法がない場合があると思います。( この時、以下のようにtrackByが提供するインデックスをそのまま返す関数を食わせてやるようにしています。
しかし、インデックスは「特定のデータに対して常に同一といわけではない」ため、適切ではない気がしていますが、どうなのでしょうか。 むしろ配列の順番が変えられたときに、誤った順番をngForに認識させるような気がするのですが、そのような挙動に出くわしたことがないので、なにか理解を間違っているような気がしています……。 |
Beta Was this translation helpful? Give feedback.
Replies: 3 comments
-
Posted by lacolaco on 2020-01-29T07:01:33.776Z indexでtrackByした場合、たとえば
という配列があったとき、それぞれをトラッキングするキーが、 この配列がたとえば次のように変化したとき、問題があります。
この配列はトラッキングするキーは trackByを trackByが |
Beta Was this translation helpful? Give feedback.
-
Posted by akai on 2020-01-29T07:16:29.788Z なるほど。 trackBy関数の目的を「配列に対して、データの更新/追加の位置を特定するための関数」と理解したらしっくりきました。 また、mutableな配列に対しては |
Beta Was this translation helpful? Give feedback.
-
Posted by akai on 2020-01-30T08:20:01.385Z ところで、この話題は先日配信された Angular質問室 でもlacoさんに言及してもらっているので、 ついでに、カンタンなものなのですが、上述の配信内で私が発言した |
Beta Was this translation helpful? Give feedback.
Posted by lacolaco on 2020-01-29T07:01:33.776Z
indexでtrackByした場合、たとえば
items = [{key: "foo"}, {key: "bar"}, {key: "baz"}]
という配列があったとき、それぞれをトラッキングするキーが、
[0, 1, 2]
となります。この配列がたとえば次のように変化したとき、問題があります。
items = [{key: "foo"}, {key: "bar"}, {key: "boo"}, {key: "baz"}]
この配列はトラッキングするキーは
[0, 1, 2, 3]
になります。このとき、trackByの結果が3というのは前回存在しなかったものなので、
{key: "baz"}]
は新たに追加された要素とみなされます。4つの要素に対応するDOMレンダリングは、[更新、更新、更新、追加]
となります。これでよいならいいのですが、
:enter
など使ったアニメーションが絡むと本当に追加されたのは{key: "boo"}
だと思われるので、不都合があります。trackByを
item.key
を返すようにしておくと、4つの要素に対応するDOMレンダリングは、[更新、更新、追加、更新]
となります。trackByが
item
を返すと、オブジェクトの厳密比較で判断するようになります。配列の変更がmutableなら、これでも[更新、更新、追加、更新]
となるでしょう