14

以下代码不起作用,因为该集合包含欺骗:

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

我认为以下应该有效,但不幸的是不起作用:

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

那是一个错误吗?

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

提前致谢,

奥利维尔

4

3 回答 3

17

此功能已添加到 AngularJS 的较新版本中。关键是基本上你不应该迭代一些原始类型(例如数字),而是一些复杂的对象。

据我了解,该ngRepeat指令检查引用而不是实际值,因此,如果您迭代一些复杂的对象,它会起作用,但是如果您尝试对一组原始类型执行此操作,那么只要“全部”,它很可能无法工作这些值彼此不同。

编辑

以下几行是此链接的副本和粘贴(并确保您使用的是相对最新版本的 AngularJS - 我使用的是 1.1.5 并且它运行良好 -)

描述

如果 ngRepeat 表达式中有重复的键,则发生。禁止重复键,因为 AngularJS 使用键将 DOM 节点与项目相关联。

默认情况下,集合是通过引用进行键控的,这对于大多数常见模型来说是可取的,但对于实习的原始类型(共享引用)可能会出现问题。

例如,此无效代码可能会触发问题:

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

要解决此错误,请确保集合中的项目具有唯一标识,使用 track by 语法来指定如何跟踪模型和 DOM 之间的关联。

要解决上面的示例,可以通过 $index 使用 track 来解决,这将导致项目以它们在数组中的位置而不是它们的值作为键:

<div ng-repeat="value in [4, 4] track by $index"></div>
于 2013-12-08T10:34:57.560 回答
2

您可以做的一件事是在角度文档中添加“track by $index”,这会将跟踪逻辑更改为元素的索引而不是元素的值,但这将显示重复的值。要仅显示唯一值,您可以通过编写如下函数过滤掉唯一值:

    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;
}

然后对此进行 ng-repeat。

于 2015-06-06T08:13:55.013 回答
0

Angular 过滤器 3rd 方过滤器包含一个“唯一”过滤器,它将为您提供集合中唯一的条目。

https://github.com/a8m/angular-filter

用法:

收藏 | 独特的:'属性'

于 2015-11-18T23:18:41.453 回答