2012-11-07 18 views
21

Ich habe eine Reihe von Elementen, die ich in ng-repeat mit einem ng-Modell als die Zeichenfolge filter den Satz filtern möchte, bis jetzt habe ich keine Möglichkeit gefunden, es funktioniert, wenn der Ausdruck negiert wird, so etwas wie ich tue:Angularjs Filter negiert

im documentation, heißt es, dass wir nutzen sollten! den Ausdruck zu negieren, aber immer noch kein Glück.

Was mache ich falsch?

+1

Wenn Ihr Filter eine Methode (keine Zeichenfolge oder Modell) Lösung ist hier veröffentlicht: http://stackoverflow.com/questions/13464809/reverse-polarity-of-an-angular-js-filter/17811582#17811582 –

Antwort

42

'!' Zeichen voranstellen, um die Filterzeichenfolge, wie unten:

Filter: '!' + languageOrigin

<select ng-model="languageOrigin" ng-change="updatePrice()"> 
    <option ng-repeat="language in languages">{{language}}</option> 
</select> 
<select ng-model="languageDestination" ng-change="updatePrice()"> 
    <option ng-repeat="language in languages | filter:'!'+languageOrigin">{{language}}</option> 
</select> 
+1

Das war das Problem. das '!' muss ein Charakter sein. Vielen Dank! – lgomezma

+0

Verwenden Sie 'ng-options' bei Auswahl anstelle von' ng-repeat'. – EpokK

+0

Wird dies noch in v1.2.0rc1 unterstützt? Ich kann das nicht zur Arbeit bringen. –

4

UPDATE: siehe ENDOH Takanaos Antwort.

Mit Blick auf die AngularJS source code, scheint es, dass "!" negiert das Ergebnis des Prädikats, nicht das Prädikat selbst:

var search = function(obj, text){ 
    if (text.charAt(0) === '!') { 
     return !search(obj, text.substr(1)); 
    } 
    switch (typeof obj) { 
    ... 

ein Weg Also, dies zu umgehen, ist zu [Wenn Ihnen das nicht gefallen + myFilter Syntax, ‚!‘] können Sie definieren sie Ihre eigene Prädikatfunktion in Ihrem Controller:

$scope.inverseOriginFilter = function(item) { 
    return item.search($scope.languageOrigin) == -1 
} 

es dann in Ihrem HTML verwenden:

<select ng-model="languageDestination" ng-change="updatePrice()" 
    ng-options="language for language in languages | filter:inverseOriginFilter"> 
</select> 

Beispiel fiddle.

+0

das funktioniert in der Tat, aber ich frage mich, ob es nicht direkt von AngularJS implementiert werden sollte ... – lgomezma

+0

das funktioniert gut, wenn Ihr Modell für jede Auswahl Drop-Down ist das Ziel selbst, aber was ist, wenn es an etwas anderes bereits angehängt? – iamwhitebox

22

Wenn Objekte verwenden, könnten Sie auch folgende Angebote interessieren:

<li data-ng-repeat="obj in objs | filter:({obj_attr: '!obj_val'})"> 
    ... 
</li> 

Getestet in AngularJS 1.1.5.

+2

es funktioniert, wenn obj_attr string-Werte enthält, aber wie soll ich nicht null angeben? '' (leere) string? –

+0

das Beispiel hat es für mich gemacht, aber aufpassen, dass, wenn Sie basierend auf Strings nicht leer filtern wollen, es sieht schrecklich aus, aber immer noch arbeiten: 'filter: {prop: '!'}' wo '!' einfach übersetzt "nicht leer". Hässlich, aber es funktioniert :) –

2

Wenn Sie eine Methode zum Filtern als Präfixierung des Methodennamens mit '!' wird nicht funktionieren. Stattdessen können Sie etwas tun:

// You can register this in your AppCtrl if you like, otherwise just use $scope. 
$rootScope.not = function(func) { 
    return function (item) { 
     return !func(item); 
    } 
}; 

Dann tun Sie:

filter:not(myFilterMethod) 

in Ihrem HTML würde es wie folgt aussehen:

<select ng-model="languageDestination" ng-change="updatePrice()"> 
    <option ng-repeat="language in languages | filter:not(languageOrigin)">{{language}}</option> 
</select> 

Referenz: https://stackoverflow.com/a/17811582/175830

1

I‘ m mit 1.3.15 und ENDOH's Lösung hat nicht funktioniert. Stattdessen arbeitete filter:'!':languageOrigin für mich.