2013-10-16 5 views
14

मैं एक कोणीय कस्टम फ़िल्टर लिखने की कोशिश कर रहा हूं जो जांचता है कि क्या देशों की एक सरणी उपयोगकर्ता द्वारा दर्ज की गई खोज स्ट्रिंग है।स्ट्रिंग टुकड़े/तारों के अनुक्रमों को खोजने के लिए मैं कोणीय फ़िल्टर कैसे लिख सकता हूं

स्ट्रिंग में एक अक्षर (उदा। 'ई'), या एन-अक्षरों (जैसे 'लैन') या एक संपूर्ण शब्द (जैसे 'इंग्लैंड') का एक टुकड़ा शामिल हो सकता है।

हर मामले में, सभी देशों से युक्त है कि एक पत्र या कि टुकड़ा वापस आ जाना चाहिए, ताकि 'ई' 'इंग्लैंड', 'एस्टोनिया' आदि जबकि 'लैन' 'इंग्लैंड' वापसी होगी, 'आयरलैंड' वापसी होगी, आदि

अब तक मेरे फ़िल्टर पूरे देश या एक पत्र देता है, लेकिन मैं स्ट्रिंग टुकड़े के साथ कठिनाई हो रही हूँ:

  1. एचटीएमएल टेम्पलेट:

    <input ng-model="filter.text" type="search" placeholder="Filter..."/> 
    
    <ul> 
        <li ng-repeat="item in data | listfilter:filter.text"> 
    </ul> 
    
  2. AngularJS

    angular.module('sgComponents').filter('listfilter',[ function() { 
    return function(items, searchText) { 
        var filtered = [];    
    
        angular.forEach(items, function(item) { 
         if(item.label === searchText) { // matches whole word, e.g. 'England' 
          filtered.push(item); 
         } 
         var letters = item.label.split(''); 
         _.each(letters, function(letter) { 
          if (letter === searchText) { // matches single letter, e.g. 'E' 
           console.log('pushing'); 
           filtered.push(item); 
          } 
         }); 
         // code to match letter fragments, e.g. 'lan' 
        }); 
        return filtered; 
    }; 
    }]); 
    

उत्तर

24

ऐसा नहीं है कि तुलना में बहुत सरल है, String.indexOf() का उपयोग कार्य:

angular.forEach(items, function(item) { 
    if(item.label.indexOf(searchText) >= 0) filtered.push(item); 
}); 

आप दोनों तारचालू करना चाहते हैंकेस-संवेदी मिलान करने के लिए:

searchText = searchText.toLowerCase(); 
angular.forEach(items, function(item) { 
    if(item.label.toLowerCase().indexOf(searchText) >= 0) filtered.push(item); 
}); 
+0

सही! बहुत बहुत धन्यवाद। जैसा कि आप अनुशंसा करते हैं, मुझे इसे करने की ज़रूरत है: यदि (item.label.toLowerCase()। IndexOf (searchText.toLowerCase())> = 0) filtered.push (आइटम); – Tone

0

typeahead के लिए कोणीय-यूआई-बूटस्ट्रैप निर्देश पर एक नजर डालें यह वास्तव में क्या आप चाहते हैं: http://angular-ui.github.io/bootstrap/#/typeahead

+0

उत्तर के लिए धन्यवाद, लेकिन दुर्भाग्य से मैं का उपयोग नहीं कोणीय-ui – Tone

+3

Fwiw, कोणीय-ui jQuery-ui की तरह एक विकास रूपरेखा आप होने के लिए 'है कि नहीं है का उपयोग करते हुए '। यह उन हिस्सों की एक किट है जिसे आप आवश्यकतानुसार तैनात कर सकते हैं, अन्यथा आपके ऐप को संशोधित करने की आवश्यकता के बिना। – XML

7
angular.module('sgComponents').filter('listfilter',[ function() { 
    return function(items, searchText) { 
     var filtered = []; 
     var regex = new RegExp(".*" + searchItem + ".*", "ig"); 
     angular.forEach(items, function(item) { 
      if(regex.test(item)){ 
       filtered.push(item); 
      } 
     }); 
     return filtered; 
    } 
}]); 
+1

ऐसा न करें: यह बहुत धीमा है। लूप से पहले कृपया 'var regex = new RegExp ("। *" + SearchItem + "। *", "Ig")' कम से कम स्थानांतरित करें। हालांकि RegExp के बजाय 'indexOf' का उपयोग करना बेहतर तरीका है। प्रतिक्रिया के लिए – kseb

+0

धन्यवाद। निकोस 'इंडेक्सऑफ() समाधान लागू करने के लिए सबसे आसान साबित हुआ। – Tone

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