以下代码无效,因为该集合包含dupes:
<div ng-repeat="value in [4, 4]"></div>
我认为以下内容应该有效,但遗憾的是无效:
<div ng-repeat="value in [4, 4] track by $index"></div>
这是一个错误吗?
有没有办法在包含dupes的集合上使用ng-repeat
?
提前致谢,
奥利弗
答案 0 :(得分:17)
此功能已在较新版本中添加到AngularJS中。 重点是,基本上你不应该迭代一些原始类型(例如数字),而是迭代一些复杂的对象。
从我所理解的ngRepeat
指令检查引用而不是实际值,所以如果你迭代一些复杂的对象,它会讨论,但如果你试图在一组原始类型上做到这一点,它很可能只要“所有”值彼此不同,就无法工作。
修改强>
以下几行是this link的副本和粘贴(并确保您使用的是AngularJS的相对最新版本 - 我使用的是1.1.5并且它运行良好 - )
<强>描述强>
如果ngRepeat表达式中存在重复键,则会发生。禁止重复键,因为AngularJS使用键将DOM节点与项目关联。
默认情况下,集合通过引用进行键控,这对于大多数常见模型来说是理想的,但对于实际的基本类型(共享引用)可能会有问题。
例如,此无效代码可以触发此问题:
<div ng-repeat="value in [4, 4]"> </div>
要解决此错误,请确保集合中的项目具有使用track by语法的唯一标识,以指定如何跟踪模型与DOM之间的关联。
要解决上面的示例,可以使用$ index跟踪来解决,这将导致项目在数组中的位置而不是它们的值中键入:
<div ng-repeat="value in [4, 4] track by $index"></div>
答案 1 :(得分:2)
您可以做的一件事是添加&#34;跟踪$ index&#34;如在角documentation中,它将跟踪逻辑更改为元素的索引而不是元素的值,但这将显示重复的值。要仅显示唯一值,您可以通过编写如下函数来过滤掉唯一值:
var uniqueValues = function(data){
var check = {};
var uniqueValue = [];
for(i-0;i<data.length;i++){
if(!check[data[i]]){
uniqueValue.push(data[i]);
check(data[i]) = true;
}
}
return uniqueValue;
}
然后对此进行重复操作。
答案 2 :(得分:0)
Angular Filter第三方文件管理器包含一个“唯一”过滤器,只会为您提供集合中的唯一条目。
https://github.com/a8m/angular-filter
用法:
收藏|独特:'财产'