Angularjs 何时不使用';按$index';以有角度重复?

Angularjs 何时不使用';按$index';以有角度重复?,angularjs,angularjs-ng-repeat,Angularjs,Angularjs Ng Repeat,我最近遇到了控制台错误` 错误:[ngRepeat:dupes]中继器中不允许重复。使用“跟踪依据”表达式指定唯一关键点 然后我使用了“按$index跟踪”,问题就解决了 但这让我想。。。您是否有理由不想在ng repeat中使用track by$index 我读过很多问题,如,但似乎几乎所有的文章都只讨论了使用“跟踪方式”的优点 有人能列出缺点并举例说明你什么时候不想使用按$index跟踪吗?它有一个缺点 'track by'表达式按数组中的索引进行跟踪。这意味着只要索引保持不变,angul

我最近遇到了控制台错误`

错误:[ngRepeat:dupes]中继器中不允许重复。使用“跟踪依据”表达式指定唯一关键点

然后我使用了
“按$index跟踪”
,问题就解决了

但这让我想。。。您是否有理由不想在ng repeat中使用
track by$index

我读过很多问题,如,但似乎几乎所有的文章都只讨论了使用
“跟踪方式”
的优点


有人能列出缺点并举例说明你什么时候不想使用
按$index跟踪吗?

它有一个
缺点

'track by'
表达式按数组中的索引进行跟踪。这意味着只要索引保持不变,angularjs就会认为它是同一个对象

因此,如果替换数组中的任何对象,angularjs认为它没有改变,因为数组中的索引仍然相同。正因为如此,更改检测不会在您期望的时候触发

看看这个

试着改变名字,什么也没发生。 按索引删除轨迹,它可以工作。
按item.name添加track,它仍然有效。

有多种原因可以避免
按$index添加track

  • 使用时避免使用
    按$index跟踪
  • 当存在唯一的属性标识符时,避免按$index跟踪
  • 按$index跟踪问题的其他示例

使用时避免使用
按$index跟踪
文档特别指出,在使用一次性绑定时,应避免使用
track by$index

从文档中:

当重复模板包含以下内容时,请避免使用
按$index跟踪
。在这种情况下,
nth
DOM元素将始终与数组的
nth
项匹配,因此即使相应项发生更改,该元素上的绑定也不会更新,从而导致视图与基础数据不同步


当存在唯一的属性标识符时,避免按$index跟踪 当有唯一的属性标识符可使用时,请避免按$index跟踪在处理所有唯一的对象时,最好让
ng repeat
使用自己的跟踪,而不是使用
track by$index
覆盖

从文档中:

如果使用具有唯一标识符属性的对象,则应按此标识符而不是对象实例进行跟踪。如果以后重新加载数据,
ngRepeat
将不必为已呈现的项重新构建DOM元素,即使集合中的JavaScript对象已替换为新对象。对于大型集合,这将显著提高渲染性能


按$index跟踪问题的其他示例
我还看到了在对象数组中添加和删除对象时出现的问题


您可以通过
跟踪($index+item)
绕过此问题,如果