Szukam sposobu, aby w zasadzie powiedzieć Angularowi, aby pominął element w powtórzeniu ng, jeśli pasuje do wyrażenia, w zasadzie continue
;
W kontrolerze:
$scope.players = [{
name_key:'FirstPerson', first_name:'First', last_name:'Person'
}, {
name_key:'SecondPerson', first_name:'Second', last_name:'Person'
}]
Teraz w moim szablonie chcę pokazać wszystkim, którzy nie pasują name_key='FirstPerson'
. Pomyślałem, że to filtry, więc skonfigurowałem Plunkra, aby się nim bawić, ale nie miałem szczęścia. Plunkr Attempt
angularjs
angularjs-ng-repeat
aron.duby
źródło
źródło
Odpowiedzi:
Jak zasugerował @Maxim Shoustin , najlepszym sposobem osiągnięcia tego, co chcesz, byłoby użycie niestandardowego filtra.
Ale są też inne sposoby, jednym z nich jest użycie
ng-if
dyrektywy w tym samym elemencie, w którym umieściłeśng-repeat
dyrektywę (również, tutaj jest plunker ):<ul> <li ng-repeat="player in players" ng-if="player.name_key!='FirstPerson'"></li> </ul>
Z estetycznego punktu widzenia może to stanowić niewielką wadę, ale ma tę główną zaletę, że filtrowanie może opierać się na regule, która nie jest tak ściśle powiązana z
players
tablicą i może łatwo uzyskać dostęp do innych danych w zakresie aplikacji:<li ng-repeat="player in players" ng-if="app.loggedIn && player.name != user.name" ></li>
Aktualizacja
Jak wspomniano, jest to jedno z rozwiązań tego rodzaju problemu i może, ale nie musi, odpowiadać Twoim potrzebom.
Jak wskazano w komentarzach,
ng-if
jest to dyrektywa, co w rzeczywistości oznacza, że może zrobić więcej rzeczy w tle, niż można by się spodziewać.Na przykład
ng-if
tworzy nowy zakres z jego rodzica :Zwykle nie wpływa to na normalne zachowanie, ale aby zapobiec nieoczekiwanym przypadkom, należy o tym pamiętać przed wdrożeniem.
źródło
Wiem, że to stara, ale gdyby ktoś szukał innego możliwego rozwiązania, oto inny sposób rozwiązania tego problemu - użyj standardowej funkcjonalności filtra :
Więc dla przykładu TS powinno zrobić coś takiego:
<ul> <li ng-repeat="player in players | filter: { name_key: '!FirstPerson' }"></li> </ul>
Nie ma potrzeby pisania niestandardowych filtrów, nie ma potrzeby używania
ng-if
ich z nowym zakresem.źródło
player in players | filter: { name_key: '' }
? Ta konkretna dyrektywa nie będzie dotyczyła tylko graczy bez pustego polaname_key
. Odwrotność, któraname_key: '!'
ma na celu wybranie dowolnego gracza z niepustym,name_key
również nie zadziała.ng-repeat="(key, val) in player"
Podczas implementacji możesz użyć niestandardowego filtru
ng-repeat
. Coś jak:data-ng-repeat="player in players | myfilter:search.name
myfilter.js
:app.filter('myfilter', function() { return function( items, name) { var filtered = []; angular.forEach(items, function(item) { if(name == undefined || name == ''){ filtered.push(item); } /* only if you want start With*/ // else if(item.name_key.substring(0, name.length) !== name){ // filtered.push(item); // } /* if you want contains*/ // else if(item.name_key.indexOf(name) < 0 ){ // filtered.push(item); // } /* if you want match full name*/ else if(item.name_key !== name ){ filtered.push(item); } }); return filtered; }; });
Próbny Plunker
źródło