0

Ich habe einen Repeater, die ich durch den Text filtern müssen, in ein Textfeld eingegeben, so dass ich habe dieseAngularJS Filter Repeater mit mehreren Werten

<tr ng-repeat="i in filteredItems = (iso3166 | filter: {alpha_2: countryQuery})">

Die Daten erfolgt eine json Array von Objekten, $ scope.iso3166:

[{ 
    "name": "Afghanistan", 
    "alpha_2": "AF", 
    "alpha_3": "AFG", 
    "country-code": "004", 
    "iso_3166-2": "ISO 3166-2:AF", 
    "region": "Asia", 
    "sub-region": "Southern Asia", 
    "region-code": "142", 
    "sub-region-code": "034", 
    "license": "unclassified", 
    "prohibited": "unclassified", 
    "size": "unclassified" 
}, ... 

So können Sie "af" und die Tabellen Filter Afghanistan zu zeigen.

Jetzt muss ich haben, was in das Feld return passt nicht nur gegen den alpha_2 Schlüssel eingegeben wird, sondern auch die name eins. Zum Beispiel sollte "af" nicht nur "Afghanistan", sondern auch "Zentralafrikanische Republik" entsprechen.

Ich schaute auf die Angular 1.4.1 Docs und sah die Komma-Methode, aber es scheint einen UND-Vergleich durchzuführen. Wie in

<tr ng-repeat="i in filteredItems = (iso3166 | filter: {alpha_2: countryQuery, name: countryQuery })">

Gibt es eine Möglichkeit ein „oder“ in diesem Fall zu tun, so dass alles, was Filter auf alle Elemente eingegeben wird, in dem die Abfrage in „alpha_2“ ist oder „name“?

UPDATE: Wenn jemand neugierig ist, gewickelt ich einen Filter verwenden, wie unten in einer Antwort vorgeschlagen:

$scope.countryFilter = function (value) { 
    if (angular.isUndefined($scope.countryQuery) || $scope.countryQuery === '') { 
     return true; 
    } 
    return value.name.indexOf($scope.countryQuery) >= 0 || value.alpha_2.indexOf($scope.countryQuery) >= 0; 
    }; 
+0

Haben Sie versucht: 'i in filteredItems | filter: countryQuery'? – theblindprophet

+0

ja, aber das wird mit jedem Feld übereinstimmen. Ich möchte zum Beispiel "region: Africa" ​​nicht mit "af" vergleichen. Nur die Felder "alpha_2" oder "name". – Steve

Antwort

1

Statt es auf diese Art und Weise zu tun, könnten Sie den Namen einer Funktion geben die Ergebnisse zu filtern und implementieren Sie dann die Filterlogik in Ihrem Controller.

<tr ng-repeat="i in filteredItems = (iso3166 | filter: filterFn)"> 

In Controller:

scope.filterFn = function(item) { 
    if(//item meets criteria) { 
     //returning true will put the item into the ng-repeat data 
     return true; 
    } 
    return false; 
} 
+0

Ich habe einen Filter geschrieben. Ich bevorzuge es immer noch im HTML, aber es war schneller. – Steve

0

Sie Eigenschaften in den ng-Wiederholungs-Filter wie folgt anwenden:

https://jsfiddle.net/pzek3tmy/

-Controller

function Controller($scope) { 
     var vm = this; 

     vm.regions = [{ 
     "name": "Afghanistan", 
     "alpha_2": "AF", 
     "alpha_3": "AFG", 
     "country-code": "004", 
     "iso_3166-2": "ISO 3166-2:AF", 
     "region": "Asia", 
     "sub-region": "Southern Asia", 
     "region-code": "142", 
     "sub-region-code": "034", 
     "license": "unclassified", 
     "prohibited": "unclassified", 
     "size": "unclassified" 
     }, { 
     "name": "Germany", 
     "alpha_2": "GN", 
     "alpha_3": "AFG", 
     "country-code": "004", 
     "iso_3166-2": "ISO 3166-2:AF", 
     "region": "Asia", 
     "sub-region": "Europe", 
     "region-code": "143", 
     "sub-region-code": "034", 
     "license": "unclassified", 
     "prohibited": "unclassified", 
     "size": "unclassified" 
     }]; 
    } 

HTML

<div ng-controller="Controller as ctrl"> 
    <input type="text" ng-model="region_filter"> 
    <ul> 
    <li ng-repeat="region in ctrl.regions | filter:{'alpha_2':region_filter} | filter:{'name':region_filter}">{{region.name}}  </li> 
    </ul> 
</div> 
+0

Dies wird nur Übereinstimmungen zurückgeben, die beide übereinstimmen (UND), die Frage war, wie man (ODER) abgleicht. In Ihrem Beispiel wird "Deutschland" das Deutschlandergebnis nicht zurückgeben. –