2013-07-05 19 views
41

Potrzebuję filtrować listę przedmiotów według ich kategorii. Chcę, aby użytkownik mógł kliknąć przycisk, a następnie zastosować filtr do listy.Dokładny filtr AngularJS

W tej chwili mam to działa w pewnym stopniu.

Powiedzmy na przykład mam listę filmów, renderowane tak:

<li ng-repeat="movie in movieList | filter:filters">{{ movie.title }}</li> 

I mam również listę gatunków filmowych (renderowany jako przyciski, które po kliknięciu będzie filtrować listę filmów) renderowane tak:

<li ng-repeat="genre in genres"> 
    <a ng-click="filters.genre = genre.name" ng-click='changeGenre(genre.name)'>{{genre.name}}</a> 
</li> 

(wszystkie „changeGenre()” funkcja nie jest zaktualizować zakres, aby pokazać, który gatunek jest aktualnie oglądany).

Teraz działa dobrze, dopóki nie mam sytuacji, w której, powiedzmy, mam 2 gatunki: "Akcja" i "Akcja Przygoda". Kiedy filtruję filmy według gatunku "Akcja", otrzymuję nie tylko listę filmów akcji, ale także filmy akcji przygodowych.

Czy istnieje sposób, w jaki mogę uzyskać dokładne dopasowanie za pomocą filtra?

+1

Wierz, że chcesz napisać niestandardowy filtr http://www.youtube.com/watch?v=zdfseHACtCg – shaunhusain

Odpowiedz

106

ta jest obecnie warunkiem natywnie w filtrze. Możesz po prostu przekazać wartość true do filtra, aby umożliwić ścisłe dopasowywanie.

<li ng-repeat="movie in movieList | filter : filters : true">{{ movie.title }}</li> 

Refereces

https://docs.angularjs.org/api/ng/filter/filter

https://stackoverflow.com/a/18243147/1466430

+1

Dzięki za zaktualizowane informacje. To jest znacznie łatwiejsze. – chrispr

+0

Dokładnie to, czego szukałem dzięki: – deKajoo

+0

Dzięki! Zaoszczędziłam dużo czasu –

8

filter może również pełnić funkcję, w której można zaimplementować własny filtr. Zrobiłem plunker pokazując go w akcji: http://plnkr.co/edit/v0uzGS?p=preview

Oto odpowiedni kod:

$scope.ChooseGenreFunction = function(genre) { 
    $scope.filters = function(movie) { 
    return movie.genre === genre; 
    }; 
}; 
$scope.ChooseGenreString = function(genre) { 
    $scope.filters = genre; 
}; 
+0

Dzięki stary! Jesteś bohaterem –

+2

@ jtseng edytował twoją odpowiedź, aby użyć '===' zamiast '==' – bguiz

28

W przypadku gdy ktoś chce użyć filtru na boku JavaScript można zrobić to lubią:

$scope.filtered = $filter('filter')($scope.movieList, { genre.name: filters.genre}, true); 

zauważy prawdziwe na końcu ... wskazuje, że to jest wyszukiwanie h dla dokładnego dopasowania.

+3

Dziękujemy za dodanie wersji JS! – mhodges

+0

Dzięki za pomoc. Zaoszczędziłem dużo czasu. –