2012-12-11 11 views
17

Ich habe das Benutzerobjekt wie folgt definiert.AngularJS Filter nur auf bestimmte Objekte

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

Ich habe den folgenden Code:

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

hier, wenn ich suche, erhalte ich Ergebnisse für Namen, Alter sowie Geschlecht. Aber ich möchte nur nach Namen und Alter suchen, und ich möchte nicht, dass Sex durchsuchbar ist. Kann mir jemand helfen, wie ich das erreichen kann?

+0

Können Sie Ihre Frage mit Beispielabfrage aktualisieren und führen Sie wollen. In Ihrem Kommentar (unten) möchten Sie, dass ein Eingabefeld mehrere Felder durchsucht, aber welche Art von Abfragen Sie eingeben können. – fredrik

Antwort

16

Ich bin mir nicht sicher, ob dies ist, was Sie sind. Wenn Sie ein Eingabefeld für mehrere Eigenschaften haben möchten, müssen Sie eine Filterfunktion an filter übergeben.

$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()); 
}; 

Hier ist ein Beispiel Geige http://jsfiddle.net/fredrik/26fZb/1/

+0

Vielen Dank fredrik! Ja, das ist was ich suche! Aber ich habe ein Problem hier. Ich bekomme immer $ scope.searchText ** undefined **. Ich bin immer nur die Funktionen und Vars innerhalb Controller als Optionen für $ Bereich definiert und nicht die ** ng-Modell = search bekommen ** hier in $ Umfang. –

+0

$ scope.searchText ist undefiniert, bis Sie etwas in das Eingabefeld eingegeben haben. Können Sie Ihre Frage mit dem vollständigen Code aktualisieren, den Sie verwenden? – fredrik

+0

Gibt es eine Möglichkeit, Sonderzeichen in die Suche einzubeziehen? wenn ich '?' in dem Suchfeld, wirft es mir Fehler ‚Ungültiger regulären Ausdruck://: Nichts zu wiederholen‘ – user1153484

21

Sie können ein Objekt als zweiten Parameter übergeben, dies zu erreichen, wenn Sie zwei Felder suchen haben

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

Andernfalls müssen Sie einen benutzerdefinierten Filter schreiben, das gleiche Feld für beide zu verwenden, oder Pass eine benutzerdefinierte Filterfunktion als dritter Parameter, der in den Dokumenten beschrieben wird.

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

+0

Vielen Dank ricick! Aber ich kann nicht zwei Suchfelder haben. Können Sie mir helfen, wie ich das gleiche Feld für beide verwenden kann? –

+8

Übrigens wird dies eine UND-Suche durchführen, kein OR, wie Sie vielleicht hoffen ... – Geert

0

Ein anderer möglicher Ansatz ist ein zu schaffen Aggregatfeld, das die Werte aller Felder enthält, die Sie nach Verkettung filtern möchten, und nur danach filtern.

+1

Ich liebe diese Antwort nicht, aber es ist bei weitem die einfachste. Danke fürs Schreiben – Patrick

1

Dies ist nicht der sauberste Weg zu erreichen, was Sie wollen, aber es ist der einfachste Weg, einen ODER-Filter mit den Standard-ng-Wiederholungs-Filter zu erreichen.

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>