Filtrowanie powtórzeń Angular 1.2 ng za pomocą „track by” przez właściwość boolowską

80

Próbuję filtrować niektóre elementy listy na podstawie wartości właściwości logicznej, ale bez względu na to, co zrobię, cała lista jest zawsze wyświetlana. Kilka rzeczy, których próbowałem, zostało tak zepsutych, że nic się nie wyświetla, ale to nie jest ani tu, ani tam. Nie mogę sprawić, by moje filtrowanie działało zgodnie z oczekiwaniami:

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

Stosując następujące filtrowanie powtórzeń ng:

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

Wydaje mi się, że wypróbowałem każdą permutację, do której mogę znaleźć odniesienie, z których większość pochodzi z różnych wyników wyszukiwania 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'}

Próbowałem również utworzyć niestandardową funkcję filtru:

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

I stosując go w ten sposób:

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

Żadne z nich nie wydaje się działać. czego mi brakuje?

Oto plnkr, który pokazuje mój problem .

Adam Tuttle
źródło

Odpowiedzi:

252

Ścieżka obok musi znajdować się na końcu wyrażenia:

<li ng-repeat="person in attendees | filter: {arrived: false } track by person.id">
Gruff Bunny
źródło
3
Jakie to denerwujące i strata 30 minut. Chciałbym, żeby był używany trackBy: ..i działał normalnie "jak wszystko inne".
user2864740
To jest bardzo ważny punkt. Śledząc unikalne wartości, które były w dużej mierze identyczne dla większości wiodących znaków, otrzymywaliśmy błąd duplikatów, ponieważ śledzenie według nie było ostatnim w wyrażeniu. Dość niejasny błąd imo.
Matt S
2

@ Gruff odpowiedź jest poprawna, ale wystarczy podać odpowiedź z oficjalnego źródła:

Z ng-repeatdokumentacji Angulara :

Uwaga: track byzawsze musi to być ostatnie wyrażenie :

<div ng-repeat="model in collection | orderBy: 'id' as filtered_result track by model.id">
  {{model.name}}
</div>

Pojawia się również w części „Argumenty” dokumentów:

Zwróć uwagę, że wyrażenie śledzące musi znajdować się na końcu, po wszelkich filtrach i wyrażeniu aliasu.

Mistalis
źródło