ng-repeat: filtrar por campo único

484

Eu tenho uma variedade de produtos que estou repetindo usando ng-repeat e estou usando

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

para filtrar esses produtos por cor. O filtro está funcionando, mas se o nome / descrição do produto, etc., contiver a cor, o produto permanecerá após a aplicação do filtro.

Como definir o filtro para aplicar apenas ao campo de cores da minha matriz, e não a todos os campos?

Tim Webster
fonte
Filtros personalizados também são poderosos =), você pode gostar, por exemplo: noypi-linux.blogspot.com/2014/07/…
Noypi Gilas
Solução diferente: stackoverflow.com/a/24992197/257470
andrew.fox
Bom

Respostas:

475

Veja o exemplo na página de filtro . Use um objeto e defina a cor na propriedade color:

Search by color: <input type="text" ng-model="search.color">
<div ng-repeat="product in products | filter:search"> 
Mark Rajcok
fonte
Obrigado Mark, existem benefícios em fazê-lo dessa maneira, em vez do método sugerido abaixo?
Tim Webster
7
@Seglespaan, na verdade não. Você pode achar que o método apresentado por bmleite e blesh é mais agradável, pois você pode ver que está filtrando por cores. Este método é mais compacto, o que pode ser útil se você quiser pesquisar por várias propriedades, e você prefiro não ter um longo objeto no HTML: filter:{ color: '...', size: '...', ...}
Mark Rajcok
2
@ MarkRajcok, como eu seria capaz de pesquisar por várias propriedades, olhando para a união, e não para o cruzamento?
jetcom
2
@jetcom, você precisará de um filtro personalizado, consulte stackoverflow.com/a/13845135/215945
Mark Rajcok
1
Não sei se o OP estava perguntando como criar uma caixa de pesquisa e como filtrar valores em uma repetição ng quando estão repetindo na página. A resposta abaixo desta parece mais relevante para a pergunta.
twknab
573

Especifique a propriedade (ou seja colour) em que deseja aplicar o filtro:

<div ng-repeat="product in products | filter:{ colour: by_colour }">
bmleite
fonte
5
e se eu quiser! by_colour como filtro: {color:! by_colour} "
rjdmello
27
@rjdmello apenas prefpend '!'+, assim<div ng-repeat="product in products | filter:{ colour: '!'+by_colour }">
bmleite 10/07/2014
3
Não tenho certeza se eu entendi corretamente, mas a primeira coisa que veio à minha mente foi: <div ng-repeat="product in products | filter:{ resultsMap.annie: '!!' }"> ou (algo equivalente) assim: <div ng-repeat="product in products | filter:by">e no controlador: $scope.by = { 'resultsMap.annie': '!!' };. Essa segunda abordagem oferece mais controle sobre a propriedade que está sendo filtrada. Nota: '!!'significa "não nulo".
bmleite
2
@Federico, o customFilterpode ser um objeto simples no seu scopeque você atualiza sempre que necessário. Verifique este desentupidor .
precisa saber é o seguinte
1
Essa deve ser a resposta aceita. É o mais sucinto. Bem, exceto que 'cor' tem muitas vogais.
rap
176

Você pode filtrar por um objeto com uma propriedade que corresponda aos objetos a serem filtrados:

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

Obviamente, isso pode ser passado por variável, como sugeriu Mark Rajcok.

Ben Lesh
fonte
2
digamos que eu tenha esse tipo de escopo.products: {id: 1, nome: 'test', cor: 'lightblue'}, {id: 2, nome: 'bob', color: [{foreground: black, background : branco}]}. então como posso filtrar o produto com base em color: background para obter valor em branco?
Gery
2
@Ery: Honestamente, eu não acho que você pode. De qualquer forma, usar filtro: de qualquer maneira, é uma prática ruim, IMO. Na medida em que coloca a lógica na sua opinião, ela realmente deve estar no seu controlador e não é muito testável.
precisa
Essa é uma maneira de mover a filtragem para o controlador e estender o modelo. ozkary.com/2015/05/angularjs-value-mapping-with-dynamic.html .
ozkary
106

Se você deseja filtrar um neto (ou mais profundo) do objeto em questão, pode continuar a construir sua hierarquia de objetos. Por exemplo, se você deseja filtrar 'thing.properties.title', faça o seguinte:

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

Você também pode filtrar várias propriedades de um objeto apenas adicionando-as ao seu objeto de filtro:

<div ng-repeat="thing in things | filter: { properties: { title: title_filter, id: id_filter } }">
David Hansen
fonte
2
é como 'ou' tipo ou 'e' tipo de filtro.
Sss
1
A mesma pergunta é que um AND ou um OR ao filtrar mais de uma propriedade?
lostintranslation
1
para OU filtro único caminho é filtro personalizado, eu acho
Dmitri Algazin
99

A melhor maneira de fazer isso é usar uma função:

html

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

javascript

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

Como alternativa, você pode usar o ngHide ou o ngShow para mostrar e ocultar dinamicamente elementos com base em um determinado critério.

Khader MA
fonte
64

Cuidado com o filtro angular. Se você deseja selecionar um valor específico no campo, não pode usar o filtro.

Exemplo:

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

Isso selecionará os dois, porque use algo como substr
Isso significa que você deseja selecionar o produto em que "cor" contenha a string "azul" e não onde "cor" seja "azul".

Petr B.
fonte
88
<div ng-repeat="product in products | filter: { color: 'blue' }:true">funcionará apenas em correspondências exatas (o 'verdadeiro' no final é o argumento do comparador: link
Mark
21

Pesquisa por cor:

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

você pode fazer um ninho interno também.

filter:{prop1:{innerprop1:searchinput}}
CyberNinja
fonte
10

Se você fizesse o seguinte:

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

... você não apenas obteria itens do itemTypeId 2 e itemStatus 1, mas também obteria itens com o itemType 20, 22, 202, 123 e itemStatus 10, 11, 101, 123. Isso ocorre porque o filtro: .} funciona como uma string que contém uma consulta.

No entanto, se você adicionar a condição : true , ele filtrará por correspondência exata:

<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>
Phil
fonte
4

meu jeito é esse

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 é um campo de entrada ou o que você quiser

Exibindo assim

<div ng-if="x.id === sub" ng-repeat=" x in subjcts">{{x.title}}</div>
Asad Ali Khan
fonte
Em geral, utilizando ng-se uma solução limpa
Kilizo
4

Você deve usar em filter:{color_name:by_colour}vez de

filter:by_colour

Se você deseja combinar com uma única propriedade de um objeto, escreva essa propriedade em vez de objeto, caso contrário, alguma outra propriedade obterá correspondência.

amit banerjee
fonte
1

Especifique a propriedade no filtro, do objeto no qual você deseja aplicar o filtro:

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

Mas você deseja aplicar o filtro apenas no primeiro nome

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

Se você deseja filtrar para um campo:

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

Se você deseja filtrar todos os campos:

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

e https://docs.angularjs.org/api/ng/filter/filter bom para você

milad dn
fonte