ChatGPT解决这个技术问题 Extra ChatGPT

ng-repeat :按单个字段过滤

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

<div ng-repeat="product in products | filter:by_colour"> 

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

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

自定义过滤器也很强大 =),你可能会喜欢它,例如:noypi-linux.blogspot.com/2014/07/…
不同的解决方案:stackoverflow.com/a/24992197/257470
以正确的方式拼写颜色的伟大作品

b
bmleite

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

<div ng-repeat="product in products | filter:{ colour: by_colour }">

如果我想要怎么办! by_colour 作为过滤器:{颜色:! by_color }"
@rjdmello 只需添加 '!'+,就像这样 <div ng-repeat="product in products | filter:{ colour: '!'+by_colour }">
不确定我是否理解正确,但我首先想到的是:<div ng-repeat="product in products | filter:{ resultsMap.annie: '!!' }"> (类似的东西)像这样:<div ng-repeat="product in products | filter:by">,在控制器上:$scope.by = { 'resultsMap.annie': '!!' };。第二种方法使您可以更好地控制被过滤的属性。注意:'!!' 表示“非空”。
@Federico,customFilter 可以是您的 scope 上的一个简单对象,您可以随时更新。检查此plunker
这应该是公认的答案。这是最简洁的。好吧,除了“颜色”有太多元音。
M
Mario Padilla

请参阅 filter 页面上的示例。使用一个对象,并在 color 属性中设置颜色:

Search by color: <input type="text" ng-model="search.color">
<div ng-repeat="product in products | filter:search"> 

谢谢马克,这样做比下面建议的方法有什么好处吗?
@Seglespaan,不是真的。您可能会发现 bmleite 和 blesh 提供的方法读起来更好,因为您可以看到您正在按颜色进行过滤。此方法更紧凑,如果您想按多个属性进行搜索,并且希望 HTML 中没有长对象,这可能会很有用:filter:{ color: '...', size: '...', ...}
@MarkRajcok,我如何能够通过多个属性进行搜索,查看联合而不是交集?
@jetcom,您需要一个自定义过滤器,请参阅 stackoverflow.com/a/13845135/215945
我不知道 OP 是否在询问如何制作搜索框以及如何在 ng-repeat 中在页面上重复时过滤掉它们。这个问题下面的答案似乎与所提出的问题最相关。
B
Ben Lesh

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

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

正如 Mark Rajcok 所建议的,这当然可以通过变量传递。


假设我有这种 scope.products: { id: 1, name: 'test', color: 'lightblue' }, { id: 2, name: 'bob', color: [{foreground : black, background :白色的}] }。那么我如何根据颜色过滤产品:背景以获得白色值?
@Gery:老实说,我认为你不能。无论哪种方式,使用 filter: 都是一种不好的做法,IMO。因为它将逻辑放在您的视图中,而这些逻辑实际上应该在您的控制器中,并且不是非常可测试的。
这是一种将过滤移动到控制器并扩展模型的方法。 ozkary.com/2015/05/angularjs-value-mapping-with-dynamic.html
D
David Hansen

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

<div ng-repeat="thing in things | filter: { properties: { title: title_filter } }">

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

<div ng-repeat="thing in things | filter: { properties: { title: title_filter, id: id_filter } }">

这是像“或”类型还是“和”类型的过滤器。
同样的问题是过滤多个属性时是 AND 还是 OR?
对于 OR 过滤器,我认为唯一的方法是自定义过滤器
M
Mosh Feu

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

html

<div ng-repeat="product in products | filter: myFilter">

javascript

$scope.myFilter = function (item) { 
    return item === 'red' || item === 'blue'; 
};

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


谢谢,这在您进行复杂比较时非常有用
M
Mosh Feu

小心使用角度过滤器。如果要在字段中选择特定值,则不能使用过滤器。

例子:

javascript

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

html

<div ng-repeat="product in products | filter: { color: 'blue' }"> 

这将同时选择两者,因为使用类似 substr
这意味着您要选择“color”包含字符串“blue”而不是“color”为“blue”的产品。


<div ng-repeat="product in products | filter: { color: 'blue' }:true"> 仅适用于完全匹配(末尾的 'true' 是比较器参数:link
P
Paul Rooney

按颜色搜索:

<input type="text" ng-model="searchinput">
<div ng-repeat="product in products | filter:{color:searchinput}">

你也可以做一个内巢。

filter:{prop1:{innerprop1:searchinput}}

P
Phil

如果您要执行以下操作:

<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>

...您不仅会获得 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>

A
Asad Ali Khan

我的方式是这样

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"}]

sub 是一个输入字段或任何你喜欢的

像这样显示

<div ng-if="x.id === sub" ng-repeat=" x in subjcts">{{x.title}}</div>

通常使用 ng-if 是一个干净的解决方案
G
Gonzalo.-

您必须使用 filter:{color_name:by_colour} 而不是

filter:by_colour

如果要匹配对象的单个属性,请编写该属性而不是对象,否则将匹配其他一些属性。


N
Neeraj Bansal

在过滤器中指定要应用过滤器的对象的属性:

//Suppose Object
var users = [{
  "firstname": "XYZ",
  "lastname": "ABC",
  "Address": "HOUSE NO-1, Example Street, Example Town"
},
{
  "firstname": "QWE",
  "lastname": "YUIKJH",
  "Address": "HOUSE NO-11, Example Street1, Example Town1"
}]

但是您只想对名字应用过滤器

<input type = "text" ng-model = "first_name_model"/>
<div ng-repeat="user in users| filter:{ firstname: first_name_model}">

m
milad dn

如果要过滤一个字段:

label>Any: <input ng-model="search.color"></label> <br>
<tr ng-repeat="friendObj in friends | filter:search:strict">

如果要过滤所有字段:

 label>Any: <input ng-model="search.$"></label> <br>
 <tr ng-repeat="friendObj in friends | filter:search:strict">

https://docs.angularjs.org/api/ng/filter/filter对你有好处