有点挣扎。
尝试编写一个自定义过滤器,用于检查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,但是根本无法使用它,如果有人想看一下就附加一个链接。
答案 0 :(得分:1)
track by
应位于表达式的末尾:
<div ng-repeat="friend in friendsDownData | idInIdArray:friendsDownModel track by friend.id">
{{friend.label}}
</div>
答案 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;
}
});