2017-03-01 114 views
4

首先,有點背景。基本上,我使用ng-repeat呈現表格中的對象列表。我的篩選器需要能夠搜索字符串,並檢查重複對象中的每個搜索項。每個搜索條件都需要在過濾器的任何對象屬性中(以任何順序)出現以傳遞該對象。例如,如果一個對象是這樣的:Angular JS自定義過濾器

{ 
    customer: 'John Smith', 
    detail: 'Some details' 
} 

我的搜索文本是smith johndetails john smithsmith john details,它需要能夠利用這些條款,以任意順序,並找到匹配的對象。上述對象應該匹配,因爲所有搜索條件都存在。

我寫的過濾低於:

angular.module('app').filter('assetsearch', function() { 
return function (input, searchString) { 

    var searchTerms = searchString === '' ? [] : searchString.replace(/ +/g, ' ').replace(/[^\w\s]|_/g, '').toLowerCase().split(' '); 

    var matches = _.filter(input, function (asset) { 
     var textToSearch = [ 
      asset.customer, 
      asset.details 
     ]; 

     textToSearch = textToSearch.join(' ').replace(/ +/g, ' ').replace(/[^\w\s]|_/g, "").toLowerCase(); 

     var match = true; 
     _.each(searchTerms, function (term) { 
      match = (textToSearch.trim().indexOf(term) > -1) && match; 
     }); 

     return match; 
    }); 

    return matches; 
} 
}); 

我的模板代碼看起來很標準,其中$ctrl指該模板的組件控制器:

<tr ng-repeat="asset in $ctrl.assets | assetsearch:$ctrl.filters.search" ng-if="!asset.loading"> 

成績

當我搜索'約翰史密斯','約翰'或'史密斯',它的作品 - 它只是拒絕工作,當我倒過來e字符串...當字符串反轉爲'Smith John'或更改爲'Joh Smith'時,過濾器似乎根本不會被觸發(在此情況下,過濾器函數開始處的控制檯日誌不會運行,所以它似乎沒有做任何事情)。

回答

0

我會避免使用下劃線和像replace()這樣的方法,通過使用angularjs嵌套forEach循環來做更簡單的事情。

app.filter('assetsearch', function() { 
    return function(input, term) { 
    var obj = {}; 
    if (typeof term !== 'undefined') { 
     angular.forEach(input, function(v, i){ 
     var terms = term.split(" "); 
     angular.forEach(terms, function(v2, i2){ 
      if(v.toLowerCase().indexOf(v2.toLowerCase()) !== -1){ 
      obj[i] = v; 
      } 
     }); 
     }); 
    } else { 
     return input; 
    } 
    return obj; 
    }; 
}); 

我還創建了一個Plunker展示它是如何工作的真實環境:過濾器想被重寫如下。