ng-repeat不能处理包含dupes的集合

时间:2013-12-08 10:16:04

标签: angularjs dart angular-dart

以下代码无效,因为该集合包含dupes:

<div ng-repeat="value in [4, 4]"></div>

我认为以下内容应该有效,但遗憾的是无效:

<div ng-repeat="value in [4, 4] track by $index"></div>

这是一个错误吗?

有没有办法在包含dupes的集合上使用ng-repeat

提前致谢,

奥利弗

3 个答案:

答案 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

用法:

收藏|独特:'财产'