2015-07-03 99 views
0

我爲下面的離子項目編寫了搜索過濾器。它工作正常,但事實上它不會忽略標點符號。使用過濾器進行搜索,但忽略標點

所以,如果我正在搜索一個項目,有一個逗號,我想念逗號的項目,我不會找到它。有沒有辦法讓我告訴過濾器忽略逗號,甚至可能還有其他標點符號?

見下面我舉例的幾個片段:

<input class="search-bar" type="search" placeholder="Search" ng-model="data.searchQuery"> 
<ion-list> 
    <ion-item collection-repeat="hymn in hymns | filter: data.searchQuery"> 
    <h2><b>{{hymn.number}}. </b>{{hymn.title}}</h2> 
    </ion-item> 
</ion-list> 

的Javascript

var hymns = [ 
{ 
    "body": "I've written a body, it has punctuation too;\n", 
    "number": 1, 
    "title": "This Title, has a comma! and puctuations" 
}, ... 

回答

1
  1. 你可以調用一個函數來篩選項目:

    <ion-item collection-repeat="hymn in hymns | filter: myCustomFilter"> 
        <h2><b>{{hymn.number}}. </b>{{hymn.title}}</h2> 
        <p>{{hymn.body}} 
    </ion-item> 
    

    然後在控制器中定義它:

    $scope.myCustomFilter = function(hymn) { 
        var searchTerm = $scope.data.searchQuery || ''; 
        searchTerm = searchTerm.replace(/[^\w\s]|_/g, "").toLowerCase() 
    
        var hymnTitle = hymn.title.replace(/[^\w\s]|_/g, "").toLowerCase(); 
        var hymnBody = hymn.body.replace(/[^\w\s]|_/g, "").toLowerCase();  
    
        return hymnTitle.indexOf(searchTerm) > -1|| hymnBody.indexOf(searchTerm) > -1; 
    } 
    

    Codepen example using function

  2. 你也可以創建一個自定義的Angular過濾器:

    <ion-item collection-repeat="hymn in hymns | filterPunctuation: data.searchQuery"> 
        <h2><b>{{hymn.number}}. </b>{{hymn.title}}</h2> 
        <p>{{hymn.body}} 
    </ion-item> 
    

    然後這樣定義過濾器:

    .filter('filterPunctuation', function() { 
        return function(items, searchTerm) { 
        if (!searchTerm || '' === searchTerm) { 
         return items; 
        } 
    
        searchTerm = searchTerm.replace(/[^\w\s]|_/g, "").toLowerCase(); 
    
        return items.filter(function(element, index, array) { 
         var title = element.title.replace(/[^\w\s]|_/g, "").toLowerCase(); 
         var body = element.body.replace(/[^\w\s]|_/g, "").toLowerCase(); 
         return title.indexOf(searchTerm) > -1 || body.indexOf(searchTerm) > -1; 
        }); 
        } 
    }) 
    

    Codepen example using filter

這兩種方式我使用正則表達式來從搜索項和讚美詩過濾掉所有的標點屬性,然後我將它們都轉換爲小寫,這樣用戶就不必按照原樣輸入。有很多不同的方法可以做到這一點。希望這可以幫助!

+2

你是我的朋友,是一個驚人的人類編碼機器! – frazras

+0

不幸的是,這個解決方案僅限於Chrome和Firefox,因爲它使用了包含函數https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes,所以很遺憾不會爲我工作離子 - frameowork應用程序,我將不勝感激,如果你可以建議一種替代方法 – frazras

+1

好點@frazras。我更新了我的答案和Codepen示例,以使用'indexOf'而不是'includes'。 – brandyshea

0

你可以這樣做

<input class="search-bar" type="search" placeholder="Search" ng-model="data.$"> 
<ion-list> 
    <ion-item collection-repeat="hymn in hymns | filter: data"> 
    <h2><b>{{hymn.number}}. </b>{{hymn.title}}</h2> 
    </ion-item> 
</ion-list> 

plunker:http://plnkr.co/edit/I9XEk7ebBeWbzQtwdMPv?p=preview

我希望這將幫助你

+0

這是如何回答我關於忽略標點符號的問題? – frazras

+0

你可以在plunker中看到有一個例子,其中的值由' - '組成,它可以搜索 –

+0

但我的意思是我希望能夠搜索一個數字而不包括連字符例如:5551234而不是555- 1234 – frazras