AngularJS Ng-repeat和Duplicates

时间:2015-05-16 16:09:29

标签: javascript angularjs

我在SO中看到几个问题,讨论在ng-repeat中不允许重复。我的问题略有不同。在我的情况下,我很困惑因为即使数组中有重复的对象 也没有收到错误

这是我的HTML代码

<table>
      <tr ng-repeat="item in items">
        <td> {{ item.email}}</td>           
      </tr>
</table>

这是填充数组的代码

app.controller('MainCtrl', function($scope) {


$scope.items=[];

  $scope.items.push({
           "id":"1",
           "email":"a@b.com"});
  $scope.items.push({
           "id":"1",
           "email":"a@b.com"});

  $scope.items.push({
           "id":"2",
           "email":"x@y.com"});
  $scope.items.push({
           "id":"2",
           "email":"x@y.com"});


});

根据我的理解,我应该得到错误,并且数组中有重复的对象

然而它完美呈现。这是plunker链接

ng-repeat-demo

显然我遗漏了一些基本的东西。有人能指出我在理解方面的差距吗?

修改

以下是我面临的应用程序(仅因为显而易见的原因而更改了电子邮件ID)

ExampleApp.filter(“extractEmail”,function(){

  return function(items){
    //console.log("test" + input[0].highlight.file[0]);
    var filtered = [];

    console.log(" items == " + items);


    angular.forEach(items, function(item){

      if (item){
        var obj = item.highlight.file[0].toString().match(/([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})/);

      if (obj) {
        //console.log(obj[0]);
        filtered.push(obj[0]);
      }

      }


    }); 

    console.log(filtered);
    return filtered;
  }

});

我的console.log打印[“a@gmail.com", “a@gmail.com", “b@gmail.com", “b@gmail.com"]

我得到的错误

Error: [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: x in clusterState| extractEmail, Duplicate key: string:a@b.com, Duplicate value: “a@b.com"

我用类似的代码更新了plunker。无法重现

第二次修改

问题在于我使用的版本: Angular JS 1.0.x支持重复 无法重现 http://plnkr.co/edit/qrOez7aZ7X1jsOrmkfiP?p=preview

使用更高版本的 能够重现

http://plnkr.co/edit/q3oPCrW3RepxvWSZ1LB1?p=preview

2 个答案:

答案 0 :(得分:5)

javascript中的对象通过引用进行比较,而不是按值进行比较 如果对象的内容与另一个对象的内容完全相同,则无关紧要,如果引用不指向同一个对象,则它们是不同的。
E.g:

RobotBehaviour robotBehaviour = getRobotBehaviour()
Type type = robotBehaviour.GetType();
MethodInfo methodInfo = type.GetMethod((string)sentences[lineNo]);
robotBehaviour.StartCoroutine(methodInfo.Name, 0);  // <-- Solved!

如果您需要区分每个条目,您必须自己检查每个条目 Angular ngRepeat的语法变体使用// In this case "var a" and "var b" points to different objects. var a = {}; var b = {}; a == b; // false // Here, they points to the same one var a = {}; var b = a; a == b; // true 来决定哪个条目是不同的(或重复的)。

track by

答案 1 :(得分:5)

这些项目被认为是不相同的,因为它们指向不同的参考文献。

如果您要按ID跟踪,那么您会收到错误,因为ID相等。

<tr ng-repeat="item in items track by item.id">
  <td> {{ item.email}}</td>           
</tr>

看到这个小提琴:http://jsfiddle.net/aj_r/7d4n9z0u/