2013-05-15 9 views
60

Jestem początkującym programistą AngularJS i buduję małą listę ofert wypożyczalni samochodów, która pobiera pewną liczbę JSON i renderuje różne bity tych danych poprzez ng powtarzaj, z parą filtrów:AngularJS: Niestandardowe filtry i powtórzenie ng

<article data-ng-repeat="result in results | filter:search" class="result"> 
     <header><h3>{{result.carType.name}}, {{result.carDetails.doors}} door, &pound;{{result.price.value}} - {{ result.company.name }}</h3></header> 
      <ul class="result-features"> 
       <li>{{result.carDetails.hireDuration}} day hire</li> 
       <li data-ng-show="result.carDetails.airCon">Air conditioning</li> 
       <li data-ng-show="result.carDetails.unlimitedMileage">Unlimited Mileage</li> 
       <li data-ng-show="result.carDetails.theftProtection">Theft Protection</li> 
      </ul> 
    </article> 

    <h2>Filters</h2> 

    <h4>Doors:</h4> 
    <select data-ng-model="search.carDetails"> 
     <option value="">All</option> 
     <option value="2">2</option> 
     <option value="4">4</option> 
     <option value="9">9</option> 
    </select> 

    <h4>Provider:</h4> 
    Atlas Choice <input type="checkbox" data-ng-model="search.company" ng-true-value="Atlas Choice" ng-false-value="" value="Atlas Choice" /><br> 
    Holiday Autos <input type="checkbox" data-ng-model="search.company" ng-true-value="Holiday Autos" ng-false-value="" value="Holiday Autos" /><br> 
    Avis <input type="checkbox" data-ng-model="search.company" ng-true-value="Avis" ng-false-value="" value="Avis" /><br>  

teraz chcę utworzyć niestandardowy filtr w moim kontroler, który może iteracyjne nad elementów w moim nG-repeat i wrócić tylko te elementy, które spełniają określone kryteria - dla Na przykład, mogę utworzyć tablicę wartości, na podstawie której zaznaczone są pola wyboru "dostawcy", a następnie ocenić każdy element z powtórzonym poleceniem ng. Po prostu nie mogę się dowiedzieć, jak to zrobić, jeśli chodzi o składnię - czy ktoś może pomóc?

Oto mój Plunker: http://plnkr.co/edit/lNJNYagMC2rszbSOF95k?p=preview

Odpowiedz

139

Jeśli chcesz uruchomić jakąś logikę niestandardowych filtrów można utworzyć funkcję, która przyjmuje element tablicy jako argument i zwraca true lub false na podstawie tego, czy powinien on być w wynikach wyszukiwania. Następnie przekazać je do dyspozycji filter jak zrobić z obiektem search, na przykład:

JS:

$scope.filterFn = function(car) 
{ 
    // Do some tests 

    if(car.carDetails.doors > 2) 
    { 
     return true; // this will be listed in the results 
    } 

    return false; // otherwise it won't be within the results 
}; 

HTML:

... 
<article data-ng-repeat="result in results | filter:search | filter:filterFn" class="result"> 
... 

, jak można zobaczyć może łączyć wiele filtrów razem, więc dodanie niestandardowej funkcji filtru nie wymusza usunięcia poprzedniego filtru z wykorzystaniem obiektu search t (będą bezproblemowo współpracować).

+14

Ten przykład powinien znajdować się w dokumentach. –

+14

Bardzo interesujące! Filtr można uprościć do 'return car.carDetails.doors> 2;' though. – sp00m

+13

Oczywiście, że może. Zdecydowałem się na wersję bardziej szczegółową, aby uczynić ją bardziej zrozumiałą jako przykład uczenia się. – mirrormx

1

Jednym z najprostszych sposobów, aby rozwiązać ten problem jest użycie $ który jest poszukiwanie wszystkich.

Oto plunker, który pokazuje, że działa. Zmieniłem pola wyboru radio (bo myślałem, powinny one mieć charakter uzupełniający) ..

http://plnkr.co/edit/dHzvm6hR5P8G4wPuTxoi?p=preview

Jeśli chcesz bardzo specyficzny sposób to zrobić (zamiast robić rodzajowe przeszukiwanie) trzeba pracować z funkcjami w wyszukiwaniu.

Dokumentacja jest tutaj

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

28

Jeśli nadal chcesz filtru niestandardowego można przekazać w modelu wyszukiwania do filtra:

<article data-ng-repeat="result in results | cartypefilter:search" class="result"> 

Jeżeli definicja dla cartypefilter może wyglądać następująco:

app.filter('cartypefilter', function() { 
    return function(items, search) { 
    if (!search) { 
     return items; 
    } 

    var carType = search.carType; 
    if (!carType || '' === carType) { 
     return items; 
    } 

    return items.filter(function(element, index, array) { 
     return element.carType.name === search.carType; 
    }); 

    }; 
}); 

http://plnkr.co/edit/kBcUIayO8tQsTTjTA2vO?p=preview

+3

czy możesz podać więcej niż jeden parametr do filtra niestandardowego? – Vincent

4

Możesz połączyć więcej 1 filtrów funkcyjnych w tym samym filtrze powtórzenia ng

+0

możliwe filtry OR zamiast AND? – lostintranslation

+0

mmm ... Myślę, że najlepszą opcją jest funkcja do wykonania, tutaj jest przykład (nie działa) http://plnkr.co/edit/PNwyDKXk9RQcur8Tpp8w?p=preview najlepsze – alvarodoune

Powiązane problemy