在AngularJS中通过多个特定模型属性进行过滤(以OR关系)

看看这里的例子: http : //docs.angularjs.org/api/ng.filter : filter

您可以使用<input ng-model="search">通过任何手机属性进行<input ng-model="search">并且可以使用<input ng-model="search.name">通过名称进行search,并对结果进行适当的过滤按名称(input电话号码不会返回任何结果,如预期)。

比方说,我有一个“姓名”属性,“电话”属性和“秘密”属性的模型,我将如何去过滤“名称”​​和“电话”属性,而不是 “秘密”属性? 所以实质上,用户可以input一个姓名或电话号码, ng-repeat会正确过滤,但即使用户input的值等于“秘密”值的一部分,也不会返回任何内容。

谢谢。

这里是抢劫犯

使用更简洁的代码的新代码,以及查询和search列表项都不区分大小写

主要思想是创build一个filterfunction来实现这个目的。

从官方文档

函数:谓词函数可以用来写任意的filter。 该函数为数组的每个元素调用。 最终结果是谓词返回true的那些元素的数组。

 <input ng-model="query"> <tr ng-repeat="smartphone in smartphones | filter: search "> 
 $scope.search = function(item) { if (!$scope.query || (item.brand.toLowerCase().indexOf($scope.query) != -1) || (item.model.toLowerCase().indexOf($scope.query.toLowerCase()) != -1) ){ return true; } return false; }; 

更新

有些人可能会关注现实世界中的performance,这是正确的。

在现实世界中,我们可能会从控制器做这个有点filter。

这里是详细的post显示如何做到这一点。

总之,我们添加ng-change来监控新的search更改

然后触发过滤function。

您可以将对象作为parameter passing给您的filterexpression式,如“ API参考”中所述 。 这个对象可以有select地应用你感兴趣的属性,如下所示:

 <input ng-model="search.name"> <input ng-model="search.phone"> <input ng-model="search.secret"> <tr ng-repeat="user in users | filter:{name: search.name, phone: search.phone}"> 

这是一个笨蛋

这个例子非常适合AngularJS 1.1.5,但在1.0.7中并不总是如此。 在这个例子中,1.0.7会初始化所有被过滤掉的东西,然后在你开始使用input时工作。 它的行为就像input中有不匹配的值,尽pipe它们从空白开始。 如果你想保持稳定的版本,请继续为你的情况尝试一下,但有些场景可能要使用@ maxisam的解决scheme,直到1.2.0发布。

我从@ maxisam的答案启发了我自己,并创build了我自己的sortingfunction,尽pipe我会分享它(因为我很无聊)。

我想通过一系列汽车过滤情况。 所选属性要过滤名称,年份,价格和公里。 房价和公里是数字(因此使用.toString )。 我也想控制大写字母(因此.toLowerCase )。 此外,我想能够将我的filter查询拆分成不同的单词(例如给予filter2006讴歌,它发现匹配2006年与讴歌与名称)。

函数我传递给filter

  var attrs = [car.name.toLowerCase(), car.year, car.price.toString(), car.km.toString()], filters = $scope.tableOpts.filter.toLowerCase().split(' '), isStringInArray = function (string, array){ for (var j=0;j<array.length;j++){ if (array[j].indexOf(string)!==-1){return true;} } return false; }; for (var i=0;i<filters.length;i++){ if (!isStringInArray(filters[i], attrs)){return false;} } return true; }; 

希望这个答案将有助于多值filter

并在这个小提琴工作的例子

 arrayOfObjectswithKeys | filterMultiple:{key1:['value1','value2','value3',...etc],key2:'value4',key3:[value5,value6,...etc]} 

如果您打算使用第三方库,那么带有很多filter的“Angular Filters”可能会很有用:

https://github.com/a8m/angular-filter#filterby

 collection | filterBy: [prop, nested.prop, etc..]: search 

在这里有一堆很好的解决scheme,但是我build议去这个路线。 如果search是最重要的,那么“秘密”财产根本就不用于视图; 我的方法是使用内置的angular度filter及其所有好处,并简单地将模型映射到一个新的对象数组。

从问题的例子:

 $scope.people = members.map(function(member) { return { name: member.name, phone: member.phone }}); 

现在,在html中,只需使用常规filter来search这两个属性。

 <div ng-repeat="member in people | filter: searchString"> 

http://plnkr.co/edit/A2IG03FLYnEYMpZ5RxEm?p=preview

这里是一个区分大小写的search,也将search分成单词,以便在每个模型中进行search。 只有当它发现一个空格,它会尝试将查询拆分成一个数组,然后search每个单词。

如果每个单词至less在其中一个模型中,则返回true。

 $scope.songSearch = function (row) { var query = angular.lowercase($scope.query); if (query.indexOf(" ") > 0) { query_array = query.split(" "); search_result = false; for (x in query_array) { query = query_array[x]; if (angular.lowercase(row.model1).indexOf(query || '') !== -1 || angular.lowercase(row.model2).indexOf(query || '') !== -1 || angular.lowercase(row.model3).indexOf(query || '') !== -1){ search_result = true; } else { search_result = false; break; } } return search_result; } else { return (angular.lowercase(row.model1).indexOf(query || '') !== -1 || angular.lowercase(row.model2).indexOf(query || '') !== -1 || angular.lowercase(row.model3).indexOf(query || '') !== -1); } }; 

我喜欢保持简单的时候可能。 我需要按国际进行分组,在所有列上过滤,显示每个组的计数,并在没有项目时隐藏组。

另外我不想添加一个自定义的filter只是为了这样简单的事情。

  <tbody> <tr ng-show="fusa.length > 0"><td colspan="8"><h3>USA ({{fusa.length}})</h3></td></tr> <tr ng-repeat="t in fusa = (usa = (vm.assignmentLookups | filter: {isInternational: false}) | filter: vm.searchResultText)"> <td>{{$index + 1}}</td> <td ng-bind-html="vm.highlight(t.title, vm.searchResultText)"></td> <td ng-bind-html="vm.highlight(t.genericName, vm.searchResultText)"></td> <td ng-bind-html="vm.highlight(t.mechanismsOfAction, vm.searchResultText)"></td> <td ng-bind-html="vm.highlight(t.diseaseStateIndication, vm.searchResultText)"></td> <td ng-bind-html="vm.highlight(t.assignedTo, vm.searchResultText)"></td> <td ng-bind-html="t.lastPublished | date:'medium'"></td> </tr> </tbody> <tbody> <tr ng-show="fint.length > 0"><td colspan="8"><h3>International ({{fint.length}})</h3></td></tr> <tr ng-repeat="t in fint = (int = (vm.assignmentLookups | filter: {isInternational: true}) | filter: vm.searchResultText)"> <td>{{$index + 1}}</td> <td ng-bind-html="vm.highlight(t.title, vm.searchResultText)"></td> <td ng-bind-html="vm.highlight(t.genericName, vm.searchResultText)"></td> <td ng-bind-html="vm.highlight(t.mechanismsOfAction, vm.searchResultText)"></td> <td ng-bind-html="vm.highlight(t.diseaseStateIndication, vm.searchResultText)"></td> <td ng-bind-html="vm.highlight(t.assignedTo, vm.searchResultText)"></td> <td ng-bind-html="t.lastPublished | date:'medium'"></td> </tr> </tbody> 

filter可以是一个带有字段的JavaScript对象,你可以有如下expression式:

 ng-repeat= 'item in list | filter :{property:value}' 

对于那些想要快速过滤对象的人来说,这是一个简单的解决scheme:

 <select> <option ng-repeat="card in deck.Cards | filter: {Type: 'Face'}">{{card.Name}}</option> </select> 

数组filter可以让你模仿你试图过滤的对象。 在上面的例子中,下面的类可以正常工作:

 var card = function(name, type) { var _name = name; var _type = type; return { Name: _name, Type: _type }; }; 

而甲板可能看起来像这样:

 var deck = function() { var _cards = [new card('Jack', 'Face'), new card('7', 'Numeral')]; return { Cards: _cards }; }; 

如果要过滤对象的多个属性,只需用逗号分隔字段名称即可:

 <select> <option ng-repeat="card in deck.Cards | filter: {Type: 'Face', Name: 'Jack'}">{{card.Name}}</option> </select> 

编辑:这是一个工作plnkr,提供了一个单一和多个属性filter的例子:

http://embed.plnkr.co/i0wCx6l1WPYljk57SXzV/

在angularJs中使用filterBy非常简单

为工作plnkr请按照此链接

http://plnkr.co/edit/US6xE4h0gD5CEYV0aMDf?p=preview

这已经专门用一个属性来search多个列,但不是全部。

 <!DOCTYPE html> <html ng-app="myApp"> <head> <script data-require="angular.js@1.4.1" data-semver="1.4.1" src="https://code.angularjs.org/1.4.1/angular.js"></script> <script data-require="angular-filter@0.5.2" data-semver="0.5.2" src="https://cdnjs.cloudflare.com/ajax/libs/angular-filter/0.5.2/angular-filter.js"></script> <link rel="stylesheet" href="style.css" /> <script src="script.js"></script> </head> <body ng-controller="myCtrl as vm"> <input type="text" placeholder="enter your search text" ng-model="vm.searchText" /> <table> <tr ng-repeat="row in vm.tableData | filterBy: ['col1','col2']: vm.searchText"> <td>{{row.col1}}</td> <td>{{row.col2}}</td> <td>{{row.col3}}</td> </tr> </table> <p>This will show filter from <b>two columns</b> only(col1 and col2) . Not from all. Whatever columns you add into filter array they will be searched. all columns will be used by default if you use <b>filter: vm.searchText</b></p> </body> </html> 

调节器

 // Code goes here (function(){ var myApp = angular.module('myApp',['angular.filter']); myApp.controller('myCtrl', function($scope){ var vm= this; vm.x = 20; vm.tableData = [ { col1: 'Ashok', col2: 'Tewatia', col3: '12' },{ col1: 'Babita', col2: 'Malik', col3: '34' },{ col1: 'Dinesh', col2: 'Tewatia', col3: '56' },{ col1: 'Sabita', col2: 'Malik', col3: '78' } ]; }) })();