2012-12-11 39 views
17

Aşağıdaki gibi tanımlanan kullanıcı nesnesine sahibim. Ben her arama yaptığında ben isim sonuçları, yaş gibi çok seks yapar, İşteAngularJS sadece belirli nesnelerde filtreleniyor

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

:

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

Aşağıdaki kod var. Ama sadece isim ve yaş için arama yapmak istiyorum ve ben de aranmak için seks istemiyorum. Bunu nasıl başarabilirim? İki arama alanlarını

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

Özel bir ikisi için de aynı alanını kullanmaya filtreyi veya pas yazmak gerekir olabilir eğer

+0

örnek sorgu ile sorunuzu güncelleştirmek ve istediğiniz sonucu Can. Yorumunuzda (aşağıda) birden fazla alan aramak için bir girdi alanı, ancak girmek istediğiniz sorgu türlerini istiyorsunuz? – fredrik

cevap

16

emin değilim. Birden çok özellikle eşleşen bir giriş alanına sahip olmak istiyorsanız, filter'a geçirilecek bir filtre işlevine ihtiyacınız vardır. İşte

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

bir keman örnek http://jsfiddle.net/fredrik/26fZb/1/

+0

Teşekkürler çok fredrik! Evet, baktığım şey bu! Ama burada bir sorunum var. Her zaman $ scope.searchText ** undefined ** alıyorum. Ben sadece denetleyicinin içinde $ kapsamı için seçenekler ve ** ng-model = searchText ** 'yi $ kapsamı içinde almayan seçenekler olarak tanımladım. –

+0

$ scope.searchText, giriş alanına bir şey girinceye kadar undefined olacaktır. Sorunuzu kullandığınız kodla güncelleyebilir misiniz? – fredrik

+0

Aramaya özel karakterler eklemenin bir yolu var mı? '?' yazarım arama alanında bana hata atar 'Geçersiz normal ifade: /? /: Tekrarlanacak hiçbir şey' – user1153484

21

Sen bunu başarmak için ikinci parametre olarak bir nesne iletebilirsiniz Dokümanlarda açıklanan üçüncü parametre olarak bir özel filtre işlevi. Bu Sonra ne ise

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

+0

Teşekkürler ricick! Ama iki arama alanım yok. İkisini de aynı alanı nasıl kullanabileceğim konusunda yardımcı olabilir misiniz? –

+8

Bu arada, bu bir AND-araması gerçekleştirecek, sizin için umut edemeyeceğiniz bir OR değil ... – Geert

0

Bir diğer olası yaklaşım oluşturmaktır Birleştirilmiş filtrelemek istediğiniz tüm alanların değerlerini içeren bir toplama alanı ve yalnızca bunun üzerine filtre uygulayın.

+1

Bu cevabı sevmiyorum, ama bu çok kolay. Gönderdiğiniz için teşekkürler – Patrick

1

Bu, istediğiniz şeyi gerçekleştirmenin en temiz yolu değildir, ancak standart ng-yineleme filtresini kullanarak bir OR filtresini gerçekleştirmenin en kolay yoludur.

Denetleyici:

$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> 
İlgili konular