2013-05-10 28 views
76

मेरे नियंत्रक के अंदर, मैं ऑब्जेक्ट्स की एक सरणी फ़िल्टर करना चाहता हूं। इनमें से प्रत्येक ऑब्जेक्ट एक नक्शा है जिसमें स्ट्रिंग्स के साथ-साथ सूचियां भी शामिल हो सकती हैंAngularJS कस्टम फ़िल्टर फ़ंक्शन

मैंने $filter('filter')(array, function) प्रारूप का उपयोग करने का प्रयास किया लेकिन मुझे नहीं पता कि मेरे फ़ंक्शन के अंदर सरणी के अलग-अलग तत्वों को कैसे एक्सेस किया जाए। मैं जो चाहता हूं उसे दिखाने के लिए यहां एक स्निपेट है।

$filter('filter')(array, function() { 
    return criteriaMatch(item, criteria); 
}); 

और फिर criteriaMatch() में, मैं अगर व्यक्तिगत संपत्ति में से प्रत्येक से मेल खाता है

var criteriaMatch = function(item, criteria) { 
    // go thro each individual property in the item and criteria 
    // and check if they are equal 
} 

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

+3

आपको फ़िल्टर की आवश्यकता क्यों है? आमतौर पर फिल्टर टेम्पलेट्स से उपयोग किया जाता है। क्या आप अपने नियंत्रक में केवल सादा कार्य नहीं कर सकते हैं यदि आप केवल वहां से इसका उपयोग कर रहे हैं? – Ketan

+0

मैन्युअल रूप से सरणी के प्रत्येक तत्व को थ्रो करने के बजाए, मैंने सोचा कि हम कोणीय की $ फ़िल्टर ('फ़िल्टर') कार्यक्षमता का उपयोग कर सकते हैं (यदि हम केवल अनुमानित फ़ंक्शन निर्दिष्ट करते हैं तो प्रत्येक तत्व को फिर से शुरू करने का ख्याल रखेगा) – user2368436

उत्तर

154

आप इस तरह इसका इस्तेमाल कर सकते हैं: http://plnkr.co/edit/vtNjEgmpItqxX5fdwtPi?p=preview

जैसा आप पाया, filter विधेय समारोह जो सरणी से आइटम से आइटम स्वीकार करता है स्वीकार करता है। तो, आपको केवल criteria के आधार पर एक अनुमानित फ़ंक्शन बनाना होगा।

इस उदाहरण में, criteriaMatch एक ऐसा फ़ंक्शन है जो फ़ंक्शन देता है जो दिए गए criteria से मेल खाता है।

टेम्पलेट:

<div ng-repeat="item in items | filter:criteriaMatch(criteria)"> 
    {{ item }} 
</div> 

गुंजाइश:

$scope.criteriaMatch = function(criteria) { 
    return function(item) { 
    return item.name === criteria.name; 
    }; 
}; 
+0

मैं नहीं एचटीएमएल से इस मानदंड मैच फ़ंक्शन का उपयोग करें .. मैं इसे नियंत्रक के अंदर से कैसे कॉल करूं यह सही है? $ फ़िल्टर ('फ़िल्टर') (सरणी, फ़ंक्शन() {वापसी मानदंड मैच (आइटम, मानदंड);}); – user2368436

+5

यदि आप इसे अपने टेम्पलेट में उपयोग नहीं कर रहे हैं, तो फ़िल्टर को परिभाषित करने से आपको कोई फायदा नहीं होता है। आप बस एक साधारण जावास्क्रिप्ट फ़ंक्शन को परिभाषित कर सकते हैं, क्योंकि यह वहां भी छोटा है। आप ऐरे ऑब्जेक्ट में मूल 'फ़िल्टर' विधि का उपयोग कर सकते हैं: 'array.filter (फ़ंक्शन (आइटम) {वापसी आइटम.नाम === मानदंड.नाम;})' – Tosh

+0

मेरे पास जावास्क्रिप्ट फ़ंक्शन है। बस यह सुनिश्चित करना चाहता था कि कोणीय के पास ऐसा करने का कोई आसान तरीका न हो .. मैं आपका जवाब स्वीकार करूंगा। धन्यवाद। – user2368436

0

साथ ही, आपको उसी तरह अपने नियंत्रक में फिल्टर का उपयोग करना चाहते हैं तो आप यहां कर:

<div ng-repeat="item in items | filter:criteriaMatch(criteria)"> 
    {{ item }} 
</div> 

आप कुछ ऐसा कर सकता है:

var filteredItems = $scope.$eval('items | filter:filter:criteriaMatch(criteria)'); 
+4

वैकल्पिक रूप से, 'var filteredItems = $ फ़िल्टर (' मानदंड मैच ') (आइटम, मानदंड); ' – 321zeno

2

यहां एक उदाहरण दिया गया है कि आप अपने कोणीय जेएस जावास्क्रिप्ट (HTML तत्व के बजाए) के अंदर filter का उपयोग कैसे करेंगे।

इस उदाहरण में, हमारे पास देश के रिकॉर्ड की एक श्रृंखला है, प्रत्येक में एक नाम और 3-वर्ण आईएसओ कोड है।

हम एक ऐसा फ़ंक्शन लिखना चाहते हैं जो इस सूची के माध्यम से एक रिकॉर्ड के लिए खोज करेगा जो एक विशिष्ट 3-वर्ण कोड से मेल खाता है।

यहाँ कैसे हम इसेfilter का उपयोग किए बिना कर करेंगे:

$scope.FindCountryByCode = function (CountryCode) { 
    // Search through an array of Country records for one containing a particular 3-character country-code. 
    // Returns either a record, or NULL, if the country couldn't be found. 
    for (var i = 0; i < $scope.CountryList.length; i++) { 
     if ($scope.CountryList[i].IsoAlpha3 == CountryCode) { 
      return $scope.CountryList[i]; 
     }; 
    }; 
    return null; 
}; 

हाँ, उस के साथ कुछ भी गलत नहीं।

लेकिन यहाँ एक ही समारोह, यह कैसी दिखाई देगी filter का उपयोग कर रहा है:

$scope.FindCountryByCode = function (CountryCode) { 
    // Search through an array of Country records for one containing a particular 3-character country-code. 
    // Returns either a record, or NULL, if the country couldn't be found. 

    var matches = $scope.CountryList.filter(function (el) { return el.IsoAlpha3 == CountryCode; }) 

    // If 'filter' didn't find any matching records, its result will be an array of 0 records. 
    if (matches.length == 0) 
     return null; 

    // Otherwise, it should've found just one matching record 
    return matches[0]; 
}; 

बहुत neater।

याद रखें कि filter परिणामस्वरूप एक सरणी (मिलान रिकॉर्ड की एक सूची) देता है, इसलिए इस उदाहरण में, हम या तो 1 रिकॉर्ड, या नल वापस करना चाहते हैं।

उम्मीद है कि इससे मदद मिलती है।

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