自定义筛选器导致“不允许在转发器中重复”

时间:2015-08-04 10:01:28

标签: angularjs angular-filters

有点挣扎。

尝试编写一个自定义过滤器,用于检查friendsDownData(一个id后跟标签的数组)中重复数据的id,数据采用以下格式。

    $scope.friendsDownData = [
        {id:'55bb89251a882a135df1fdee', label: 'bengtbj@gmail.com'},
        {id:'55bbd8a5a60af1235e2966f6', label: 'test01@test.com'},
        {id:'55bbd8cda60af1235e2966f9', label: 'test02@test.com'},
        {id:'55bf76f0fb8423116d477d9b', label: 'brian@test.com'},
        {id:'55bf9ffbfb8423116d477d9e', label: 'emma@test.com'},
        ];

在发生错误时,friendsDownModel只包含一个id(尝试使用空和多个,就我所知,没有任何区别)。

   $scope.friendsDownModel = [
       {id: '55bb89251a882a135df1fdee'}
        ]

完整的错误消息如下所示:

Error: [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: friend in friendsDownData track by friend.id| idInIdArray:friendsDownModel, Duplicate key: false, Duplicate value: {"id":"55bbd8cda60af1235e2966f9","label":"test02@test.com"}

ting是在调用过滤器时,我在id上使用track by。并且id永远不应该是重复的(它们是数据库ID,并且是唯一的)。对过滤器的调用如下所示。

<div ng-repeat="friend in friendsDownData track by friend.id| idInIdArray:friendsDownModel">

奇怪的是,我可以在没有音轨或过滤器的情况下进行重复播放,并且工作正常。所以我认为它是导致它的过滤器,但无法弄清楚原因。 过滤器如下所示:

myApp.filter('idInIdArray', function() {
        return function(cuId, idArray) {
            console.log("This is the first id" + idArray[0].id);
            console.log("This is the cuId" + cuId);
            for ( i=0; i<idArray.length; i++ ) {
                if (idArray[i].id === cuId) {
                    console.log("This is a match!");
                    return true;
                }
            }
            return false;

        }

    })

创建了一个JSFilter,但是根本无法使用它,如果有人想看一下就附加一个链接。

https://jsfiddle.net/vrghost/HB7LU/16034/

2 个答案:

答案 0 :(得分:1)

track by应位于表达式的末尾:

<div ng-repeat="friend in friendsDownData | idInIdArray:friendsDownModel track by friend.id">
  {{friend.label}}
</div>

Updated Fiddle

答案 1 :(得分:1)

好的,设法找出(潜在的解决方案)问题。 问题不在于数据进入,而是数据出来了。过滤器不应该返回单个回复,它应该返回一个数组。 I.E.它会被发送到两个数组,并返回一个ng-repeat应该使用的单个数组。

我不确定这是正确的解决方案,并且很想知道是否有其他方法,因为看起来过滤器无论如何被调用了五次。但这里有一个小提琴的工作过滤器(不起作用)

myApp.filter('idInIdArray', function() {
    return function(activeId, idArray) { 
      //activeId contains a list of id's and labels, so that data from friendsDownData.
        var newArray = [];
        for ( i=0; i<activeId.length; i++ ) {
            for ( x=0; x<idArray.length; x++){
                if (activeId[i].id === idArray[x].id){
                    newArray.push(activeId[i]);
                }
            }
        }
        return newArray;
    }

});