2012-08-01 20 views

उत्तर

209

असल में वहाँ एक और (शायद बेहतर समाधान) है, जहां आप कोणीय की मूल 'फिल्टर' फिल्टर का उपयोग कर सकते हैं और अभी भी करने के लिए तर्क पारित अपने कस्टम फ़िल्टर।

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

यह काम आप बस अनुसरण कर के रूप में अपने फिल्टर को परिभाषित करने के लिए::

निम्नलिखित कोड पर विचार करें

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

आप यहाँ देख सकते हैं, weDontLike वास्तव में एक और समारोह है जो देता है आपके अपने दायरे में पैरामीटर के साथ-साथ मूल आइटम फ़िल्टर से आ रहा है।

मुझे यह महसूस करने में 2 दिन लग गए कि आप ऐसा कर सकते हैं, अभी तक इस समाधान को नहीं देखा है।

चेकआउट Reverse polarity of an angular.js filter यह देखने के लिए कि आप फ़िल्टर के साथ अन्य उपयोगी संचालन के लिए इसका उपयोग कैसे कर सकते हैं।

+13

इसे वास्तव में स्वीकार किया जाना चाहिए, यह ओपी के प्रश्न के लिए एक शर्त और कामकाजी समाधान है। अच्छा डेनिस! – ChrisR

+0

यदि आपके फ़िल्टर को कई तर्कों की आवश्यकता है, तो देखें [मैं एकाधिक तर्कों के साथ एक Angular.js फ़िल्टर कैसे कॉल करूं?] (Http://stackoverflow.com/questions/16227325/how-do-i-call-an-angular- जेएस-फिल्टर-साथ-एकाधिक-तर्क) – nh2

+0

सहमत हैं, यह चुना गया समाधान होना चाहिए। बहुत खूबसूरत! – JSancho

76

मैं क्या समझते हैं कि आप एक फिल्टर समारोह के लिए एक तर्क पारित नहीं हो सकता है (जब 'फिल्टर' फिल्टर का उपयोग कर) से। तुम क्या करने के लिए होगा एक कस्टम फ़िल्टर लिखना है, इस तरह sth:

.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; 
}; 

यहाँ काम कर jsFiddle है: http://jsfiddle.net/pkozlowski_opensource/myr4a/1/

अन्य सरल विकल्प, कस्टम फ़िल्टर को लिखने के बिना करने के लिए एक नाम स्टोर करने के लिए है एक दायरे में को फ़िल्टर और उसके बाद लिखें:

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

Thats प्रीफेक्ट धन्यवाद! दायरे में नाम संग्रह करना इतना अच्छा काम नहीं करेगा क्योंकि मेरे पास एक ही पृष्ठ पर एक ही डेटा से तीन सूचियां हैं जो विभिन्न राज्यों (या नामों) के साथ फ़िल्टरिंग कर रही हैं। – shapeshifter

+0

गतिशील रूप से 'एडम' (आपके जेएसएफडल का जिक्र करते हुए) सेट करने के लिए कोई भी? यह ngModel और कोणीय में एक कस्टम फ़िल्टर को गठबंधन करने के लिए असंभव प्रतीत होता है (और मुझे लगता है कि उद्देश्य पर है) ... – Rolf

+0

क्या फ़िल्टर के पैरामीटर को पुन: व्यवस्थित करना संभव है? उदाहरण के लिए आइटम को फ़िल्टर के दूसरे पैरामीटर पर पास करें? – Pooya

61

वास्तव में आप एक पैरामीटर (http://docs.angularjs.org/api/ng.filter:filter) पारित कर सकते हैं और सिर्फ इस के लिए एक कस्टम समारोह जरूरत नहीं है। आप अपने HTML पुनर्लेखन तो नीचे के रूप में यह काम करेंगे:

<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

हां। साइड नोट - अगर किसी का नाम 'एडम' है, तो आप उसे {name: '!! Adam'} की तरह प्राप्त करते हैं। – honzajde

+5

आप यहां भी इस तरह के 'फ़िल्टर: [' एडम ',' जॉन ']' – iConnor

+6

jsfiddle लिंक टूटा हुआ है जैसे arrays भी पास कर सकते हैं। – Seregwethrin

2

pkozlowski.opensource's answer पर विस्तार और का उपयोग कर जावास्क्रिप्ट array's builtin फिल्टर विधि एक prettified समाधान इस हो सकता है:

.filter('weDontLike', function(){ 
    return function(items, name){ 
     return items.filter(function(item) { 
      return item.name != name; 
     }); 
    }; 
}); 

यहाँ jsfiddle link है।

ऐरे फ़िल्टर here पर अधिक।

23

आप बस इस की तरह कर सकते हैं खाका में

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

फिल्टर

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"; 
    } 
    }); 
+1

सरल और आसान! –

+1

मुझे यह तकनीक अन्य तकनीकों की तुलना में बेहतर पसंद है। – Greg

+1

यह सही समाधान है। – Cam

0

में आप कोणीय फिल्टर करने के लिए कई तर्क पारित कर सकते हैं!

मेरी कोणीय एप्लिकेशन और हो और ऐप स्तर चर को परिभाषित करना -

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

आपका फ़िल्टर किया जाएगा: -

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; 
    }]); 

और HTML से आप की तरह डेटा भेज देंगे: -

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

यहां मैं फ़िल्टर पर एक JSON ऑब्जेक्ट भेज रहा हूं। आप स्ट्रिंग या संख्या जैसे किसी भी प्रकार का डेटा भी भेज सकते हैं।

भी आप उस मामले आप उन तर्कों को पाने के लिए तर्क उपयोग करने के लिए में फिल्टर करने के लिए, तर्कों की गतिशील संख्या पारित कर सकते हैं।

एक कामकाजी डेमो के लिए यहां जाएं - passing multiple arguments to angular filter

संबंधित मुद्दे