Angular:当你需要"跟踪"但你没有一个独特的属性来跟踪时,你会怎么做?

Ada*_*ner 2 javascript angularjs angularjs-ng-repeat angularjs-track-by

假设我正在ng-repeat结束images,这是一个具有a 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'},
];
Run Code Online (Sandbox Code Playgroud)

假设可能存在重复的图像,因此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)

Joe*_*ger 6

1)你说得对.$ index是给出约束的唯一方法,并不是最优的.

2)语法是"逐个表达式".表达式可以是任何有效的角度表达式,因此

track by image.src + image.caption
Run Code Online (Sandbox Code Playgroud)

完全有效.

3)跟踪不使用观察者.ngRepeat指令维护由跟踪表达式索引的模型和DOM节点的内部映射.它尝试尽可能重用DOM节点(和范围).它唯一值得关注的是系列.