ng-repeat:按单个字段过滤

Tim*_*ter 477 angularjs ng-repeat angularjs-filter

我有一系列产品,我正在重复使用ng-repeat和我正在使用

<div ng-repeat="product in products | filter:by_colour"> 
Run Code Online (Sandbox Code Playgroud)

用颜色过滤这些产品.过滤器正在运行,但如果产品名称/描述等包含颜色,则在应用过滤器后产品仍然存在.

如何将过滤器设置为仅应用于数组的颜色字段而不是每个字段?

bml*_*ite 571

指定colour要应用过滤器的属性(即):

<div ng-repeat="product in products | filter:{ colour: by_colour }">
Run Code Online (Sandbox Code Playgroud)

  • @rjdmello只是在''!'+`前加上,就像产品中的`<div ng-repeat ="产品| filter:{color:'!'+ by_colour}">` (27认同)
  • 如果我想要怎么办!by_colour作为过滤器:{color :! by_colour}" (5认同)
  • 不确定我是否理解正确,但我想到的第一件事是:`<div ng-repeat ="产品中的产品| filter:{resultsMap.annie:'!!' 像这样的`**或**(相当于等价物):`<div ng-repeat ="产品中的产品| filter:by">`并且在控制器上:`$ scope.by = {'resultsMap.annie ':'!!' };`.第二种方法使您可以更好地控制要过滤的属性.注意:`'!!'`表示"非空". (3认同)
  • @Federico,`customFilter`可以是你`范围'上的一个简单对象,你可以在需要时更新它.检查此[plunker](http://plnkr.co/edit/uP6tDh7wnGSSNYlkOyL5?p=preview). (2认同)

Mar*_*cok 470

请参阅过滤器页面上的示例.使用对象,并在color属性中设置颜色:

Search by color: <input type="text" ng-model="search.color">
<div ng-repeat="product in products | filter:search"> 
Run Code Online (Sandbox Code Playgroud)

  • @Seglespaan,不是真的.您可能会发现bmleite和blesh呈现的方法读得更好,因为您可以看到您按颜色过滤.这个方法更紧凑,如果你想要通过多个属性进行搜索,并且你不想在HTML中有一个长对象:`filter:{color:'...',size:'.. .',...}` (7认同)
  • @MarkRajcok,我怎样才能通过多个属性进行搜索,查看联合,而不是交集? (2认同)
  • @jetcom,您需要一个自定义过滤器,请参阅http://stackoverflow.com/a/13845135/215945 (2认同)

Ben*_*esh 173

您可以通过具有与您必须在其上过滤的对象匹配的属性的对象进行过滤:

app.controller('FooCtrl', function($scope) {
   $scope.products = [
       { id: 1, name: 'test', color: 'red' },
       { id: 2, name: 'bob', color: 'blue' }
       /*... etc... */
   ];
});
Run Code Online (Sandbox Code Playgroud)
<div ng-repeat="product in products | filter: { color: 'red' }"> 
Run Code Online (Sandbox Code Playgroud)

正如Mark Rajcok所说,这当然可以通过变量传递.

  • 让我说我有这种范围.产品:{id:1,名称:'测试',颜色:'lightblue'},{id:2,名称:'bob',颜色:[{前景:黑色,背景:white}]}.那我怎样才能根据颜色过滤产品:背景来获得白色值? (2认同)
  • @Gery:老实说,我认为你不能.无论哪种方式,使用过滤器:完全是一种不好的做法,IMO.因为它在您的视图中放置了应该在您的控制器中的逻辑,并且不是非常可测试的. (2认同)

Dav*_*sen 106

如果要对给定对象的孙(或更深)进行过滤,可以继续构建对象层次结构.例如,如果要对'thing.properties.title'进行过滤,则可以执行以下操作:

<div ng-repeat="thing in things | filter: { properties: { title: title_filter } }">
Run Code Online (Sandbox Code Playgroud)

您还可以通过将对象添加到过滤器对象来过滤对象的多个属性:

<div ng-repeat="thing in things | filter: { properties: { title: title_filter, id: id_filter } }">
Run Code Online (Sandbox Code Playgroud)

  • 这是一个AND过滤器 (5认同)
  • 这就像'或'类型或'和'类型的过滤器. (2认同)

Kha*_*M A 98

最好的方法是使用一个函数:

HTML

<div ng-repeat="product in products | filter: myFilter">
Run Code Online (Sandbox Code Playgroud)

JavaScript的

$scope.myFilter = function (item) { 
    return item === 'red' || item === 'blue'; 
};
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用ngHide或ngShow根据特定条件动态显示和隐藏元素.


Pet*_* B. 64

小心角度滤镜.如果要在字段中选择特定值,则无法使用过滤器.

例:

JavaScript的

app.controller('FooCtrl', function($scope) {
   $scope.products = [
       { id: 1, name: 'test', color: 'lightblue' },
       { id: 2, name: 'bob', color: 'blue' }
       /*... etc... */
   ];
});
Run Code Online (Sandbox Code Playgroud)

HTML

<div ng-repeat="product in products | filter: { color: 'blue' }"> 
Run Code Online (Sandbox Code Playgroud)

这将选择两者,因为使用类似的东西substr
意味着你想要选择产品,其中"颜色"包含字符串"蓝色"而不是"颜色"是"蓝色".

  • `<div ng-repeat ="产品中的产品| filter:{color:'blue'}:true">`只能处理精确匹配(最后的'true'是比较器参数:[link](http ://docs.angularjs.org/api/ng.filter:过滤器) (86认同)

Cyb*_*nja 19

按颜色搜索:

<input type="text" ng-model="searchinput">
<div ng-repeat="product in products | filter:{color:searchinput}">
Run Code Online (Sandbox Code Playgroud)

你也可以做内巢.

filter:{prop1:{innerprop1:searchinput}}
Run Code Online (Sandbox Code Playgroud)


Phi*_*hil 10

如果您要执行以下操作:

<li class="active-item" ng-repeat="item in mc.pageData.items | filter: { itemTypeId: 2, itemStatus: 1 } | orderBy : 'listIndex'"
                id="{{item.id}}">
    <span class="item-title">{{preference.itemTitle}}</span>
</li>
Run Code Online (Sandbox Code Playgroud)

...你不仅会获得itemTypeId 2和itemStatus 1的项目,而且还会获得itemType为20,22,202,123和itemStatus 10,11,101,123的项目.这是因为过滤器:{.. .}语法就像一个包含查询的字符串.

但是,如果您要添加:true条件,它将按完全匹配进行过滤:

<li class="active-item" ng-repeat="item in mc.pageData.items | filter: { itemTypeId: 2, itemStatus: 1 } : true | orderBy : 'listIndex'"
                id="{{item.id}}">
    <span class="item-title">{{preference.itemTitle}}</span>
</li>
Run Code Online (Sandbox Code Playgroud)


Asa*_*han 6

我的方式是这样

subjcts is

[{"id":"1","title":"GFATM"},{"id":"2","title":"Court Case"},{"id":"3","title":"Renewal\/Validity"},{"id":"4","title":"Change of Details"},{"id":"5","title":"Student Query"},{"id":"6","title":"Complains"}]
Run Code Online (Sandbox Code Playgroud)

sub 是输入字段或您喜欢的任何内容

像这样显示

<div ng-if="x.id === sub" ng-repeat=" x in subjcts">{{x.title}}</div>
Run Code Online (Sandbox Code Playgroud)