AngularJS कस्टम फ़िल्टर फ़ंक्शन


91

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

मैंने $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
आपको एक फ़िल्टर की आवश्यकता क्यों है? आमतौर पर फिल्टर टेम्प्लेट से उपयोग किए जाते हैं। क्या आप अपने नियंत्रक में केवल एक सादे कार्य नहीं कर सकते हैं यदि आपका केवल वहां से इसका उपयोग कर रहा है?
केतन

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

जवाबों:


173

आप इसे इस तरह से उपयोग कर सकते हैं: 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;
  };
};

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

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

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

2

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

इस उदाहरण में, हमारे पास देश के रिकॉर्ड की एक सरणी है, प्रत्येक में एक नाम और 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];
};

बहुत नटखट।

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

उम्मीद है की यह मदद करेगा।


0

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

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

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

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

6
वैकल्पिक रूप से,var filteredItems = $filter('criteriaMatch')(items, criteria);
20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.