2013-03-16 4 views
20

तो अगर मैं एक सरणी है:क्या किसी अन्य सरणी में contution द्वारा angular.js फ़िल्टर करना संभव है?

$scope.letters = 
[{"id":"a"}, 
{"id":"b"}, 
{"id":"c"}]; 

और एक और सरणी

$scope.filterBy = ["b","c","d"]; 

और मैं कुछ एनजी-दोहराने केवल आइटम है कि $ filterBy में प्रदर्शित द्वारा $ scope.letters फिल्टर करने के लिए करना चाहते हैं।

मैं के प्रभाव के लिए कुछ करने के लिए सक्षम होना चाहते हैं:

<span ng-repeat="{{letter in letters|filter: letter.id in filterBy }} > {{letter.id}} </span> 

और यह ख प्रिंट है, ग

मैं जानता हूँ कि यह एक बहुत बेवकूफ उदाहरण है, लेकिन वहाँ के लिए एक रास्ता है किसी अन्य सरणी ऑब्जेक्ट की सामग्री के आधार पर an कोणीय.जेएस अभिव्यक्ति फ़िल्टर करें?

angular.module('Test', []); 

function Ctrl($scope) { 
    $scope.letters = [ 
    {id: 'a'}, 
    {id: 'b'}, 
    {id: 'c'} 
    ]; 

    $scope.filterBy = ['b', 'c', 'd']; 

    $scope.filteredLetters = function() { 
    return $scope.letters.filter(function (letter) { 
     return $scope.filterBy.indexOf(letter.id) !== -1; 
    }); 
    }; 
} 

Ctrl.$inject = ['$scope']; 

एचटीएमएल:

<div ng-repeat='letter in filteredLetters(letters)'>{{letter.id}}</div> 

आप live example कोशिश कर सकते हैं

जे एस:

उत्तर

29

आप ऐसा ही कुछ प्रयास करना चाहिए।

+6

फ़िल्टर किए गए लिटर() को _every_ पाचन चक्र कहा जाएगा। तो यदि आपके पास अपने दृश्य में एनजी-मॉडल का उपयोग करके इनपुट फ़ील्ड में है, तो इसका मतलब है कि प्रत्येक कीस्ट्रोक। एक नए $ स्कोप संपत्ति पर फ़िल्टर के परिणामों को स्टोर करना बेहतर होगा। यदि 'अक्षर 'या' फ़िल्टरबी' परिवर्तन 'फ़िल्टर परिणामों को अपडेट करने के लिए $ watch() es का उपयोग करें। –

+0

अच्छा बिंदु। सलाह के लिए धन्यवाद। – ValeriiVasin

+0

हालांकि यह काम करेगा (बशर्ते आपका ऐप बहुत आसान हो) मैं इस दृष्टिकोण का उपयोग करने की अनुशंसा नहीं करता - जैसा कि @ मार्ककाजकोक उल्लेख करता है, इसे प्रत्येक पाचन चक्र कहा जाता है जिसका अर्थ है कि प्रदर्शन भयानक है और मुझे कोणीय से त्रुटियां मिल रही हैं जैसे "त्रुटि: [$ रूटस्कोप: infdig] 10 $ पाचन() पुनरावृत्तियों तक पहुंचे। निरस्त! " –

35

अद्यतन

यहाँ एक कोणीय मॉड्यूल (@InviS उत्तर के आधार पर) आसानी से अपने कोणीय आवेदन के अंदर इस फिल्टर लागू करने के लिए है: filters-inArrayFilter


यहाँ कोणीय फिल्टर @InviS के आधार पर पहुंच दी गई है उत्तर:

फ़िल्टर इस तरह होना चाहिए:

.filter('inArray', function($filter){ 
    return function(list, arrayFilter, element){ 
     if(arrayFilter){ 
      return $filter("filter")(list, function(listItem){ 
       return arrayFilter.indexOf(listItem[element]) != -1; 
      }); 
     } 
    }; 
}); 

जहां सूची सूची आप (इस परम कोणीय द्वारा सेट किया जाता है) को फ़िल्टर कर रहे है, arrayFilter सरणी आप फिल्टर के रूप में प्रयोग कर रहे हैं, और तत्व है आपकी सूची में फ़िल्टर करने के लिए संपत्ति का नाम है।

इस फिल्टर का उपयोग करने के लिए आप के रूप में अपने एनजी-दोहराने का उपयोग करें:

<div ng-repeat='letter in letters | inArray:filterBy:"id"'>{{letter.id}}</div> 

जहां inArray फिल्टर है, filterBy(इस फिल्टर का पहला तर्क) है आपके सरणी के खिलाफ मिलान करने के लिए, और "आईडी"(दूसरा तर्क) elem है उस सूची में से जो आप सरणी के खिलाफ मेल खाना चाहते हैं।

आप कोणीय फ़िल्टर दृष्टिकोण का उपयोग करके इस live example को आजमा सकते हैं।

+0

यदि मुझे एकाधिक कॉलम फ़िल्टर करना है तो क्या होगा? क्या 'चेनिंग' करेंगे? – dreamer

+0

@ ड्रीमर एकाधिक कॉलम से आपका क्या मतलब है? – Cyberdelphos

+0

@ साइबरडेलफोस अगर ऑब्जेक्ट कुंजी एक संख्या थी तो आप फ़िल्टर कैसे करेंगे? $ सूचकांक का उपयोग करें? – alphapilgrim

6

काफी पुराना लेकिन मुझे इसकी आवश्यकता थी और मुझे इसे थोड़ा बदलना पड़ा। यहाँ मेरी फिल्टर "notInArray"

app.filter('notInArray', function($filter){ 
return function(list, arrayFilter, element){ 
    if(arrayFilter){ 
     return $filter("filter")(list, function(listItem){ 
      for (var i = 0; i < arrayFilter.length; i++) { 
       if (arrayFilter[i][element] == listItem[element]) 
        return false; 
      } 
      return true; 
     }); 
    } 
}; 

}) है,

<md-chips ng-model="filter.SelectedValues" md-autocomplete-snap 
      md-require-match="true"> 
     <md-autocomplete 
      md-search-text="searchFilterChip" 
      md-items="val in filter.Values | notInArray:filter.SelectedValues:'Id'" 
      md-item-text="val.Name" 
      md-no-cache="true" 
      md-min-length="0"> 
     <span md-highlight-text="searchFilterChip">{{val.Name}}</span> 
     </md-autocomplete> 
     <md-chip-template> 
     {{$chip.Name}} 
     </md-chip-template> 
    </md-chips> 

मुझे लगता है कि यह सुधार किया जा सकता है लेकिन मेरे मामले में इसकी आवश्यकता नहीं है।

आशा है कि किसी की मदद करें!

+0

धन्यवाद उपयोगी – Magico

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