2

假设 I'm ng-repeating over images,这是一个具有 asrc和 acaption属性的对象数组。

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) 语法是“按表达式跟踪”。表达式可以是任何有效的角度表达式,所以

track by image.src + image.caption

是完全有效的。

3) track by 不使用观察者。ngRepeat 指令维护模型和 DOM 节点的内部映射,该映射由 track by expression 索引。它尝试在可能的情况下重用 DOM 节点(和范围)。它唯一关注的就是收藏。

于 2015-03-09T00:35:37.927 回答