2012-12-12 16 views
7

Mam zdefiniowany obiekt użytkownika, jak poniżej.Jak zastosować filtr na wielu obiektach za pomocą AngularJS?

$scope.users = [{id: 1, name: 'Adam', friends: [{name: 'John', age: 21, sex: 'M'}, {name: 'Brad', age: 32, sex: 'M'}]}] 

Następnie Mam następujący kod:

<div ng-repeat="user in users> 
<input type="text" ng-model="searchText"> 
<div ng-repeat="friend in user.friends | filter:searchText"> 
    {{user.name}} {{friend.name}} {{friend.age}} 
</div> 
</div> 

Teraz po wpisaniu w polu tekstowym tekst: „searchText”, chcę filtr, aby wyświetlić nazwę użytkownika i nazwę/wiek przyjaciela. Czy ktoś może mi pomóc, jak to zrobić?

Jeśli mam rację, to myślę, że muszę utworzyć niestandardowy filtr do tego lub czy istnieje inny sposób, w jaki mogę to zrobić?

Odpowiedz

14

Ponieważ chcesz filtrować na dwie rzeczy na raz - niektóre właściwości tablicy przyjaciół i również użytkownikowi - musisz stworzyć swój własny custom filter że przyjmuje 2 dodatkowe parametry :

myApp.filter('myFilter', function() { 
    return function(friends, searchText, username) { 
    var searchRegx = new RegExp(searchText, "i"); 
    if ((searchText == undefined) || (username.search(searchRegx) != -1)) { 
     return friends; 
    } 
    var result = []; 
    for(i = 0; i < friends.length; i++) { 
     if (friends[i].name.search(searchRegx) != -1 || 
      friends[i].age.toString().search(searchText) != -1) { 
      result.push(friends[i]); 
     } 
    } 
    return result; 
    } 
}); 

Następnie nazwać tak:

<div ng-repeat="user in users"> 
    <input type="text" ng-model="searchText"> 
    <div ng-repeat="friend in user.friends | myFilter:searchText:user.name"> 
     {{user.name}} {{friend.name}} {{friend.age}} 
    </div> 
</div> 

": searchText: user.name" to sposób przekazywania dodatkowych argumentów do filtru niestandardowego.

Fiddle.

+0

Dziękuję bardzo Mark! Ale filtr filter (friends, searchText) będzie filtrował wszystkie obiekty znajomych tj. Imię i nazwisko, wiek i płeć lub tylko imię i wiek. Moim wymaganiem jest, aby tylko "imię" i "wiek" mogły być wyszukiwane, a wyniki będą filtrowane tylko na tych dwóch obiektach znajomych, ponieważ są to pola, które się wyświetlają, a nie na "seks" –

+0

Zobacz zaktualizowaną odpowiedź. –

+0

Zdaję sobie sprawę, ile to jest lat ... ale co może się wydarzyć, gdy mój tekst wejściowy "szukany tekst" jest zawsze niezdefiniowany w filtrze? Problemy z określaniem zakresu, oczywiście, ale dlaczego? – Clev3r

1

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

<div ng-repeat="user in users> 
<input type="text" ng-model="search.$"> 
<div ng-repeat="friend in user.friends | filter:search"> 
    {{user.name}} {{friend.name}} {{friend.age}} 
</div> 
</div> 
+1

Dzięki fastreload! To pomaga! Ale do czego obiekt ten będzie się filtrował? Czy ten filtr będzie wyświetlany tylko na ** nazwie użytkownika ** i ** nazwisku i wieku znajomego **? –

+0

Zgodnie z opisem w dokumentacji, będzie wyszukiwał wszystkie właściwości obiektów wewnątrz tablicy obiektów. Możesz pomyśleć o '$' jako magicznym symbolu wieloznacznym. –

+0

Dzięki fastreload! Tutaj w obiekcie mojego przyjaciela mam trzy atrybuty: imię, wiek i płeć. Ale nie chcę, żeby seks był możliwy do przeszukiwania. Czy istnieje sposób, aby to osiągnąć? –

Powiązane problemy