2

これは、とプロパティng-repeatimages持つオブジェクトの配列です。srccaption

var images = [
  {src: 'a.jpg', caption: 'a'},
  {src: 'b.jpg', caption: 'b'},
  {src: 'c.jpg', caption: 'c'},
  {src: 'd.jpg', caption: 'd'},
  {src: 'e.jpg', caption: 'e'},
  {src: 'f.jpg', caption: 'f'},
  {src: 'g.jpg', caption: 'g'},
  {src: 'h.jpg', caption: 'h'},
  {src: 'i.jpg', caption: 'i'},
  {src: 'j.jpg', caption: 'j'},
];

画像が重複している可能性があるため、src+のcaption組み合わせは一意性を保証しません。したいのですがtrack by、 以外に方法がないようです$index

$index私には悪い解決策のようです。最初の画像 (a) が削除されたとします。その後、後続のすべての画像のインデックスが変更されるため、リスト全体を再レンダリングする必要があります。これは、10 個の項目のリストではそれほど悪くありませんが、より大きなリストではそうです。

  1. 考え?

  2. また、src+が一意であることが保証されてcaption いたらどうでしょうか? どうすればtrack by複数のプロパティを取得できますか?

  3. track by追跡されたプロパティをに置くことで機能します$$watchersか? のようtrack by image.idなことをしてい$scope.$watch(image.id, cb)ますか?

4

1 に答える 1

6

1) その通りです。$index は、制約を考慮した唯一の方法であり、最適ではありません。

2) 構文は「式によるトラック」です。Expression は任意の有効な角度式にすることができるため、

track by image.src + image.caption

完全に有効です。

3) track by はウォッチャーを使用しません。ngRepeat ディレクティブはモデルの内部マップと track by 式によってインデックス付けされた DOM ノードを維持します。可能であれば、DOM ノード (およびスコープ) を再利用しようとします。$watches するのはコレクションだけです。

于 2015-03-09T00:35:37.927 に答える