使用“track by”按布尔属性过滤Angular 1.2 ng-repeat

81

我试图根据布尔属性的值筛选一些列表项,但无论我做什么,整个列表总是显示出来。我尝试了一些方法,但有些已经坏掉了,什么都没有显示出来,但这并不重要。我无法让我的筛选按预期工作:

$scope.attendees = [
     {"firstname":"Steve",    "lastname":"Jobs",  "arrived":true,  "id":1}
    ,{"firstname":"Michelle", "lastname":"Jobs",  "arrived":false, "id":2}
    ,{"firstname":"Adam",     "lastname":"Smith", "arrived":true,  "id":3}
    ,{"firstname":"Megan",    "lastname":"Smith", "arrived":false, "id":4}
    ,{"firstname":"Dylan",    "lastname":"Smith", "arrived":false, "id":5}
    ,{"firstname":"Ethan",    "lastname":"Smith", "arrived":false, "id":6}
];

使用以下ng-repeat过滤:

<ul>
    <li ng-repeat="person in attendees track by person.id | filter:arrived:'false'">
            {{person.lastname}}, {{person.firstname}}
    </li>
</ul>

我感觉我已经尝试了每一种可能的排列,其中大部分来自于不同的StackOverflow搜索结果:

  • filter:'arrived'
  • filter:arrived
  • filter:'person.arrived'
  • filter:person.arrived
  • filter:{arrived:true}
  • filter:{arrived:'true'}
  • filter:{person.arrived:true}
  • filter:{person.arrived:'true'}

我还尝试创建自定义过滤函数:

$scope.isArrived = function(item) {
    return item.arrived;
};

应用如下:

  • filter:isArrived
  • filter:'isArrived'
  • filter:{isArrived(person)}
  • filter:isArrived(person)
  • filter:'isArrived(person)'

这些都似乎不起作用。我错了什么?

这里有一个演示我的问题的 plnkr。

2个回答

256

track by 需要出现在表达式的末尾:

<li ng-repeat="person in attendees | filter: {arrived: false } track by person.id">

3
真烦人,浪费了30分钟。我希望它使用 trackBy:.. 并像“其他所有东西”一样正常运作。 - user2864740
这是非常重要的一点。由于大多数主要字符的唯一值跟踪方式基本相同,我们会因为跟踪方式不在表达式的最后而出现重复错误。在我看来,这是一个相当晦涩的错误。 - Matt S

4

@Gruff's answer是正确的,但为了提供官方来源的答案:

From the Angular ng-repeat docs:

Note: track by must always be the last expression:

<div ng-repeat="model in collection | orderBy: 'id' as filtered_result track by model.id">
  {{model.name}}
</div>
它也出现在文档的“Arguments”部分:
请注意,跟踪表达式必须放在任何过滤器和别名表达式之后。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接