ng-repeat: filtra per singolo campo


484

Ho una serie di prodotti che sto ripetendo usando ng-repeat e sto usando

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

per filtrare questi prodotti per colore. Il filtro funziona ma se il nome / descrizione del prodotto ecc. Contiene il colore, il prodotto rimane dopo l'applicazione del filtro.

Come posso impostare il filtro in modo che si applichi solo al campo colore del mio array piuttosto che a tutti i campi?


Anche i filtri personalizzati sono potenti =), potrebbe piacerti, esempio: noypi-linux.blogspot.com/2014/07/…
Noypi Gilas,


Ottimo lavoro che
scrive

Risposte:


475

Vedi l'esempio nella pagina del filtro . Usa un oggetto e imposta il colore nella proprietà color:

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

Grazie Marco, ci sono dei vantaggi nel farlo in questo modo piuttosto che nel metodo suggerito di seguito?
Tim Webster,

7
@Seglespaan, non proprio. Potresti scoprire che il metodo presentato da bmleite e blesh è più bello, dato che puoi vedere che stai filtrando per colore. Questo metodo è più compatto, il che potrebbe essere utile se si desidera cercare in base a più proprietà e si preferisce non avere un oggetto lungo in HTML: filter:{ color: '...', size: '...', ...}
Mark Rajcok,

2
@MarkRajcok, come potrei cercare per più proprietà, guardando l'unione, piuttosto che l'intersezione?
Jetcom,

2
@jetcom, avrete bisogno di un filtro personalizzato, vedere stackoverflow.com/a/13845135/215945
Mark Rajcok

1
Non so se l'OP chiedesse come fare una casella di ricerca tanto quanto come filtrare i valori in una ripetizione ng quando si ripetono sulla pagina. La risposta al di sotto di questa sembra molto pertinente alla domanda posta.
twknab,

573

Specificare la proprietà (ovvero colour) in cui si desidera applicare il filtro:

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

5
e se volessi! by_colour come filtro: {color:! by_colour} "
rjdmello

27
@rjdmello ha appena anteposto '!'+, in questo modo<div ng-repeat="product in products | filter:{ colour: '!'+by_colour }">
bmleite,

3
Non so se ho capito correttamente, ma la prima cosa che mi è venuta in mente era: <div ng-repeat="product in products | filter:{ resultsMap.annie: '!!' }"> o (qualcosa di equivalente) come questo: <div ng-repeat="product in products | filter:by">e sul controller: $scope.by = { 'resultsMap.annie': '!!' };. Questo secondo approccio offre un maggiore controllo sulla proprietà filtrata. Nota: '!!'significa "non nullo".
bmleite,

2
@Federico, customFilterpuò essere un semplice oggetto sul tuo scopeche aggiorni quando necessario. Controlla questo plunker .
bmleite,

1
Questa dovrebbe essere la risposta accettata. È il più succinto. Bene, tranne che il "colore" ha troppe vocali.
Rap

176

Puoi filtrare per oggetto con una proprietà corrispondente agli oggetti che devi filtrare su di esso:

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

Naturalmente questo può essere passato per variabile, come suggerito da Mark Rajcok.


2
diciamo che ho questo tipo di scope.products: {id: 1, nome: 'test', colore: 'azzurro'}, {id: 2, nome: 'bob', colore: [{primo piano: nero, sfondo :bianca}] }. quindi come posso filtrare il prodotto in base al colore: sfondo per ottenere il valore del bianco?
Gery

2
@Gery: Onestamente, non penso che tu possa. Ad ogni modo, usando il filtro: è una specie di cattiva pratica, IMO. In questo mette la logica nella tua visione che dovrebbe essere davvero nel tuo controller e non è molto verificabile.
Ben Lesh,

Questo è un modo per spostare il filtro sul controller ed estendere il modello. ozkary.com/2015/05/angularjs-value-mapping-with-dynamic.html .
ozkary,

106

Se vuoi filtrare un nipote (o più profondo) dell'oggetto dato, puoi continuare a costruire la tua gerarchia di oggetti. Ad esempio, se si desidera filtrare su "thing.properties.title", è possibile effettuare le seguenti operazioni:

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

Puoi anche filtrare su più proprietà di un oggetto semplicemente aggiungendole all'oggetto filtro:

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

2
è come 'o' tipo o 'e' tipo di filtro.
sms

1
La stessa domanda è che un AND o un OR durante il filtraggio di più di una proprietà?
lostintranslation

1
per il filtro OR l'unico modo è il filtro personalizzato, penso
Dmitri Algazin,

99

Il modo migliore per farlo è usare una funzione:

html

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

javascript

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

In alternativa, puoi usare ngHide o ngShow per mostrare e nascondere dinamicamente gli elementi in base a determinati criteri.


64

Fare attenzione con il filtro angolare. Se si desidera selezionare un valore specifico nel campo, non è possibile utilizzare il filtro.

Esempio:

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

Questo selezionerà entrambi, perché usa qualcosa del genere substr
Ciò significa che vuoi selezionare un prodotto in cui "colore" contenga la stringa "blu" e non dove "colore" sia "blu".


88
<div ng-repeat="product in products | filter: { color: 'blue' }:true">funzionerà solo su corrispondenze esatte (il "vero" alla fine è l'argomento del comparatore: link
Mark

21

Cerca per colore:

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

puoi anche fare un nido interno.

filter:{prop1:{innerprop1:searchinput}}

10

Se dovessi fare quanto segue:

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

... non otterresti solo articoli di itemTypeId 2 e itemStatus 1, ma otterrai anche articoli con itemType 20, 22, 202, 123 e itemStatus 10, 11, 101, 123. Questo perché il filtro: {.. .} La sintassi funziona come se una stringa contenga una query.

Tuttavia, se dovessi aggiungere la condizione : true , filtrerebbe per corrispondenza esatta:

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

4

la mia strada è questa

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 è un campo di input o quello che ti piace

Visualizzazione in questo modo

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

In generale, usare ng-if è una soluzione pulita
Kilizo,

4

È necessario utilizzare filter:{color_name:by_colour}invece di

filter:by_colour

Se si desidera abbinare una singola proprietà di un oggetto, scrivere quella proprietà anziché l'oggetto, altrimenti alcune altre proprietà otterranno la corrispondenza.


1

Specificare la proprietà nel filtro, dell'oggetto su cui si desidera applicare il 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"
}]

Ma vuoi applicare il filtro solo sul nome

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

0

Se vuoi un filtro per un campo:

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

Se vuoi un filtro per tutti i campi:

 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 ti fanno bene

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.