Argümanları açısaljs filtrelerine geçirme


99

Herhangi bir ada göre filtreleyebilmeniz için filtre işlevine bir argüman iletmek mümkün mü?

Gibi bir şey

$scope.weDontLike = function(item, name) {
    console.log(arguments);
    return item.name != name;
};

Yanıtlar:


223

Aslında, açının yerel 'filtre' filtresini kullanabileceğiniz ve yine de özel filtrenize argümanlar iletebileceğiniz başka (belki daha iyi bir çözüm) vardır.

Aşağıdaki kodu göz önünde bulundurun:

<div ng-repeat="group in groups">
    <li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)">
        <span>{{friend.name}}</span>
    <li>
</div>

Bunun çalışması için filtrenizi aşağıdaki gibi tanımlamanız yeterlidir:

$scope.weDontLike = function(name) {
    return function(friend) {
        return friend.name != name;
    }
}

Burada görebileceğiniz gibi, weDontLike aslında kendi kapsamında parametrenize ve filtreden gelen orijinal öğeye sahip başka bir işlevi döndürür.

Bunu yapabileceğinizi anlamam 2 günümü aldı, henüz bu çözümü hiçbir yerde görmedim.

Kontrol Et Bir angular.js filtresinin ters polaritesini filtreyle diğer yararlı işlemler için nasıl kullanabileceğinizi görmek için.


Filtrenizin birden çok argüman gerektirmesi durumunda, birden fazla argüman içeren bir Angular.js filtresini nasıl çağırırım? Konusuna
nh2

Bu yöntem aynı zamanda ng-yinelemede kendi parametrelerimi filtreme geçiremediğim garip bir sorunu da çözdü. Ne yaparsam yapayım indeks ve genel koleksiyon olarak geri gelmeye devam ettiler. Bu dönüş yöntemini yaparak parametrelerimi geçebildim ve yine de orijinal öğeyi yükledim, harika bir düzeltme!
Dennis Smolek

Bu cevap, bir $ kapsam değişkenini filtre işlevine parametre olarak geçiremediğimde sorunumu çözdü. EN İYİ çözüm. Oy verildi!
valafar

Bunu birden fazla kez yükseltebilseydim, SO tarihinde en çok oy alan cevap olduğundan emin olurdum. Bu yıllardır içimi sıkıyor ... ve sonra (şimdi 2 yaşında) cevabı buluyorum ... Çok teşekkür ederim.
PKD

2019'da hala yararlı! Çok teşekkürler.
ashilon

76

Anladığım kadarıyla, bir filtre işlevine bir argüman geçiremezsiniz ('filtre' filtresini kullanırken). Yapmanız gereken şey, şuna benzer bir özel filtre yazmaktır:

.filter('weDontLike', function(){

return function(items, name){

    var arrayToReturn = [];        
    for (var i=0; i<items.length; i++){
        if (items[i].name != name) {
            arrayToReturn.push(items[i]);
        }
    }

    return arrayToReturn;
};

İşte çalışan jsFiddle: http://jsfiddle.net/pkozlowski_opensource/myr4a/1/

Özel filtreler yazmadan diğer basit alternatif, bir kapsamda filtrelemek için bir ad saklamak ve ardından şunu yazmaktır:

$scope.weDontLike = function(item) {
  return item.name != $scope.name;
};

Bu mükemmel teşekkürler! Adın kapsamda depolanması o kadar iyi çalışmaz, çünkü aynı sayfada aynı veriden üç listeye sahip ve farklı durumlarla (veya adlarla) filtreleme yapıyorum.
şekil değiştirici

'Adam'ı (JSFiddle'ınıza göre) dinamik olarak ayarlamak için herhangi bir şey var mı? Angular'da ngModel ve özel bir filtreyi birleştirmek imkansız görünüyor (ve sanırım bu bilerek)
Rolf

Bir filtrenin parametrelerini yeniden sıralamak mümkün müdür? Örneğin, öğeyi bir filtrenin ikinci parametresine iletmek?
Pooya

Bu örnekte işaretlemenin {{öğeler | weDontLike: 'thenameyoudontlike'}} ... şu anda bunu elde etmek için keman çalmak zorundasın. Ayrıca özel filtrenize birden çok parametre geçirebileceğinizi de belirtmek gerekir {{öğeler | weDontLike: 'thename': ['Ben', 'bir dizi']: 've benzeri'}} bunlara erişebilmek için özel filtrenize daha fazla argüman eklersiniz.
Benjamin Conant

62

Aslında bir parametre ( http://docs.angularjs.org/api/ng.filter:filter ) iletebilir ve sadece bunun için özel bir işleve ihtiyacınız yoktur. HTML'nizi aşağıdaki gibi yeniden yazarsanız çalışacaktır:

<div ng:app>
 <div ng-controller="HelloCntl">
 <ul>
    <li ng-repeat="friend in friends | filter:{name:'!Adam'}">
        <span>{{friend.name}}</span>
        <span>{{friend.phone}}</span>
    </li>
 </ul>
 </div>
</div>

http://jsfiddle.net/ZfGx4/59/


8
Evet. Yan not - eğer birinin adı "! Adam" ise, onu {name: "!! Adam"} gibi anlarsınız.
honzajde

5
Burada dizileri de bu şekilde geçirebilirsinizfilter:['Adam', 'john']
iConnor

6
jsfiddle bağlantısı koptu.
Seregwethrin

4
Adam şimdiye kadarki en kötü isim
Ben Wheeler

6
Adam-Değil açıkça daha kötü.
twip

30

Basitçe bunu Şablonda yapabilirsiniz

<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span>

Filtrede

angular.module("app")
.filter("firstFiler",function(){

    console.log("filter loads");
    return function(items, firstArgument,secondArgument){
        console.log("item is ",items); // it is value upon which you have to filter
        console.log("firstArgument is ",firstArgument);
        console.log("secondArgument ",secondArgument);

        return "hello";
    }
    });

Bu en iyi cevap. Dinamik nesnelerle çalışır. Kabul edilen cevap bu olmalıdır.
abelabbesnabi


1

Açısal filtreye birden fazla argüman iletebilirsiniz!

Açısal uygulamamı ve uygulama düzeyinde bir değişkeni tanımlama -

var app = angular.module('filterApp',[]);
app.value('test_obj', {'TEST' : 'test be check se'});

Filtreniz şöyle olacaktır: -

app.filter('testFilter', [ 'test_obj', function(test_obj) {
    function test_filter_function(key, dynamic_data) {
      if(dynamic_data){
        var temp = test_obj[key]; 
        for(var property in dynamic_data){
            temp = temp.replace(property, dynamic_data[property]);
        }
        return temp;
      }
      else{
        return test_obj[key] || key;
      }

    }
    test_filter_function.$stateful = true;
    return test_filter_function;
  }]);

Ve HTML'den aşağıdaki gibi veriler göndereceksiniz: -

<span ng-bind="'TEST' | testFilter: { 'be': val, 'se': value2 }"></span>

Burada filtreye bir JSON nesnesi gönderiyorum. Ayrıca dize veya numara gibi her türlü veriyi gönderebilirsiniz.

Ayrıca filtrelemek için dinamik sayıda argüman iletebilirsiniz, bu durumda bu argümanları almak için argümanlar kullanmanız gerekir.

Çalışan bir demo için buraya gidin - birden çok argümanı açısal filtreye geçirmek


0

Sadece kullanabilirsin | filter:yourFunction:arg

<div ng-repeat="group in groups | filter:weDontLike:group">...</div>

Ve js'de

$scope.weDontLike = function(group) {
//here your condition/criteria
return !!group 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.