2012-12-11 16 views
17

Ho l'oggetto utente definito come di seguito.Filtro AngularJS solo su determinati oggetti

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

Ho il codice seguente:

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

Qui ogni volta che cerco, ottengo risultati per nome, l'età e il sesso. Ma voglio cercare solo il nome e l'età e non voglio che il sesso sia ricercabile. Qualcuno può aiutarmi con come posso ottenere questo?

+0

Puoi aggiornare la tua domanda con query di esempio e il risultato che si desidera. Nel tuo commento (sotto) vuoi un campo di input per cercare più campi ma quale tipo di query vuoi poter inserire? – fredrik

risposta

16

io non sono sicuro se questo è quello che cercate. Se si desidera avere un campo di input per abbinare più proprietà, è necessario passare una funzione filtro a filter.

$scope.user = {id: 1, friends: [{name: 'John', age: 21, sex: 'M'}, {name: 'Brad', age: 32, sex: 'M'}, {name: 'May', age: 64, sex: 'F'}]}; 

$scope.searchFilter = function (obj) { 
    var re = new RegExp($scope.searchText, 'i'); 
    return !$scope.searchText || re.test(obj.name) || re.test(obj.age.toString()); 
}; 

Ecco un esempio violino http://jsfiddle.net/fredrik/26fZb/1/

+0

Grazie mille fredrik! Sì, questo è quello che sto cercando! Ma sto avendo un problema qui. Ottengo sempre $ scope.searchText ** undefined **. Sto ottenendo solo le funzioni e le vars definite all'interno del controller come opzioni per $ scope e non ottenendo ** ng-model = searchText ** qui in $ scope. –

+0

$ scope.searchText non sarà definito fino a quando non avrai inserito qualcosa nel campo di input. Puoi aggiornare la tua domanda con il codice completo che stai utilizzando? – fredrik

+0

C'è un modo per includere caratteri speciali nella ricerca. se scrivo "?" nel campo di ricerca mi lancia errore 'Espressione regolare non valida: /? /: Nulla da ripetere' – user1153484

21

È possibile passare un oggetto come secondo parametro per raggiungere questo obiettivo se si possono avere due campi di ricerca

<div ng-repeat="friend in user.friends | filter:{name:searchNameText, age:searchAgeText}"> 

In caso contrario sarà necessario scrivere un filtro personalizzato per utilizzare lo stesso campo per entrambi, o di passaggio una funzione di filtro personalizzata come terzo parametro descritto nei documenti.

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

+0

Grazie mille! Ma non posso avere due campi di ricerca. Puoi aiutarmi con come posso usare lo stesso campo per entrambi? –

+8

A proposito, questo eseguirà un AND-search, non un OR come potreste sperare per ... – Geert

0

Un altro approccio possibile è quello di creare un campo aggregato che contiene i valori di tutti i campi che si desidera filtrare su concatenati e filtrare solo su quello.

+1

Non amo questa risposta, ma è di gran lunga la più semplice. Grazie per la pubblicazione – Patrick

1

Questo non è il modo più semplice per ottenere ciò che si desidera, ma è il modo più semplice per realizzare un filtro OR utilizzando il filtro standard ng-repeat.

Controller:

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

$scope.buildSearchData = buildSearchData; 

function buildSearchData(friend){ 
    return friend.name + ' ' + friend.age; 
} 

HTML

<input type="text" ng-model="searchText"> 
<div ng-repeat="friend in user.friends | filter:{searchData:searchText}" 
    ng-init="friend.searchData = buildSearchData(friend)"> 
    {{friend.name}} {{friend.age}} 
</div> 
Problemi correlati