2013-09-05 15 views
64

Cercando di filtrare gli elementi con una certa proprietà che non è nullo Così per:filtro Angularjs non nullo

var details = [{name:'Bill', shortDescription: null}, {name:'Sally', shortDescription: 'A girl'}] 

vorrei mostrare un solo li; quello per sally. Questo è quello che ho cercato senza successo

<ul> 
<li ng-repeat="detail in details | filter:{shortDescription:'!'}"> 
<p>{{detail.shortDescription}}</p> 
</li> 
</ul> 

Qualsiasi idea di come posso fare questo senza creare un filtro personalizzato? O anche così, come sarebbe il filtro personalizzato?

+0

Soluzione diversa: https://stackoverflow.com/ a/24992197/257470 –

risposta

31

In base a https://github.com/angular/angular.js/issues/11573 per Angular> = 1.4, la raccomandazione è di utilizzare '' che corrisponde a qualsiasi primitiva tranne null/non definito.

<ul> 
    <li ng-repeat="detail in details | filter:{shortDescription: ''}"> 
     <p>{{detail.shortDescription}}</p> 
    </li> 
</ul> 
+0

Grazie per aver postato! –

+2

Funziona, grazie. Ma in questo caso la sintassi angularjs è assurda (filter--). – MCurbelo

+0

@MCurbelo, la mia personale critica con la sintassi del filtro è che la parola "filtro" è ambigua. Filtraggio * per * descrizioni nulle? O filtrare * out * null descrizioni? Non si può dire guardando il codice. Un nome migliore sarebbe "filterOut" o "showOnly" (con semantica corretta). – user2023861

117

angolare> = 1.3.16 per ultime (1.5.5 al momento della scrittura/aggiornamento) utilizzare '' (stringa vuota) (o '!!' funziona anche)

<ul> 
    <li ng-repeat="detail in details | filter:{shortDescription: ''}"> 
     <p>{{detail.shortDescription}}</p> 
    </li> 
</ul> 

Esempio: http://jsfiddle.net/TheSharpieOne/1mnachk6/


angolare> = 1.3.6 e < = 1.3.15 uso '!null'

<ul> 
    <li ng-repeat="detail in details | filter:{shortDescription: '!null'}"> 
     <p>{{detail.shortDescription}}</p> 
    </li> 
</ul> 
.515.053.691,36321 milioni

Esempio: http://jsfiddle.net/TheSharpieOne/4wxs67yv/


angolare> = 1.2 e < = 1.3.5 uso '' (stringa vuota) (o '!!' funziona anche)

<ul> 
    <li ng-repeat="detail in details | filter:{shortDescription: ''}"> 
     <p>{{detail.shortDescription}}</p> 
    </li> 
</ul> 

Esempio: http://jsfiddle.net/TheSharpieOne/ovsqf17n/


Angolare < 1.2 '!!'

<ul> 
    <li ng-repeat="detail in details | filter:{shortDescription: '!!'}"> 
     <p>{{detail.shortDescription}}</p> 
    </li> 
</ul> 

Esempio: http://jsfiddle.net/TheSharpieOne/RGEdc/


Nel complesso, '!!' ha il miglior supporto, ma '' (empty string) is recommended and intended for this.

+3

Grazie mille.Ho cercato il web per oltre un'ora e non ho potuto trovare quello –

+2

Nessun problema. Filtra anche "indefinito". – TheSharpieOne

+0

Dolce. Non sembra funzionare per 'false', stranamente. –

1

Vale la pena notare che per utilizzare la soluzione di citazioni vuote, è necessario lasciare il comparatore al suo predefinito di false. È forse essere usato per mettere in vera qui nei filtri del controller, in questo modo:

const myAssessments = 
     this.filterFilter(this.assessments, {userId: this.user.id}, true); 

Questo tipo di filtro rigoroso non funzionerebbe senza il finale true. Ma è necessario far cadere il vero o rendere false per un controllo non nullo al lavoro:

const activeAndHistoric = 
     this.filterFilter(filteredAssessments, {historicYear: ''}, false); 
2

Credo che questo sia più facile da leggere

<ul> 
    <li ng-repeat="detail in details" ng-if="detail.shortDescription"> 
     <p>{{detail.shortDescription}}</p> 
    </li> 
</ul>