0

Ich versuche, durch mehrere Eigenschaften in Angular zu filtern. Ich bin in der Lage, durch eine Eigenschaft leicht zu filtern, indem ich einen eckigen filter:{ title: searchString } benutze, aber um durch mehrere Eigenschaften zu filtern ... ich schuf meinen eigenen kundenspezifischen Filter, der versucht, die Suchzeichenkette durch irgendwelche der Eigenschaften im Feld zusammenzubringen.filterung durch 2 Eigenschaften mit benutzerdefinierten Filter angularjs

Was ich tun müssen, ist:

Wenn John Wayne durchlaufen wird .. es zeigt John Wayne aber wenn nur John oder nur Wayne durch ... Es zeigt immer noch geführt wird John Wayne. Ähnliches gilt für n w seit John endet mit einem n und subTitle beginnt mit einem w

PS:

<input type="text" ng-model="searchString"> 

<div ng-repeat="tel in arr1 | customFilter: searchString:['title','subTitle']"></div> 

JS:

$scope.arr1 = [ 
    {title: 'John', subTitle:'Wayne'} 
    {title: 'Barry'} 
]; 

.filter('customFilter',[ function() { 
    return function(items, searchText, attrs) { 
     var filtered = []; 
     var filteredItems = items.map(function(item) { 
      angular.forEach(attrs, function(attr) { 
       if (item.hasOwnProperty(attr)) { 
        filtered.push(item); 
       } 
      }); 
     }); 
     return filtered; 
    }; 
}]) 
ich nur ein ng-Modell

HTML haben

Mein Problem ist, dass ich einen Fehler bekomme oder sagen:

Duplikate in einem Repeater sind nicht erlaubt. Verwenden Sie den 'track by'-Ausdruck zu , um eindeutige Schlüssel anzugeben. Repeater: tel in arr1

+0

Sie haben einen Fehler im Namen des Filters: customfilter in Ihrem Filternamen und custommFilter in Ihrem HTML –

+0

@ManuelObregozo hoppla .. Das war ein Tippfehler. Versehentlich eingefügt, dass in der Post, aber das ist nicht das Problem – user4756836

+0

Ich bekomme immer noch, was es die Idee des Filters, was ist die Ausgabe, von Ihrem Array? –

Antwort

1

ich nur ein paar Updates zu Ihren kundenspezifischen Filter aus:

app.filter('customFilter',[ function() { 
    return function(items, searchText, attrs) { 
     var filtered = []; 
     for (var i in items){ 
      var keepGoing = true; 
      angular.forEach(attrs, function(attr) { 
      console.log(items[i][attr]) 
       if (items[i].hasOwnProperty(attr) && items[i][attr].includes(searchText) && keepGoing) { 
        filtered.push(items[i]); 
        keepGoing=false; 
       } 
      }); 
     } 

     return filtered; 
    }; 
}]) 

berücksichtigen, dass in diesem Fall ist es case-sensitive ist.

Obwohl es wie erwartet funktioniert, habe ich das Gefühl, dass es verbessert werden kann.

Plunker Probe: https://plnkr.co/edit/YnkSSOpG8sBQvVChIIuP?p=preview

+0

Ich versuchte das auch vorher: (... aber in Ihrem Beispiel funktioniert es nicht, wenn ich "wayne" schreibe – user4756836

+0

was ist, was mich zum Erstellen eines benutzerdefinierten Filters führte – user4756836

+0

die Übereinstimmung Bedingung könnte auch ein Teilstring sein? –

1

Sie erhalten diesen Fehler wegen Duplikate in arr1. Nur track by $index Fügen Sie die gewünschte Lösung zu erreichen

<div ng-repeat="tel in arr1 track by $index | custommFilter: searchString:['title','subTitle']"></div> 
+0

Fehler ist weg, wenn ich track by am ende einfügen ... aber jetzt tut es nicht was ich will ... es filtert nicht richtig – user4756836

+0

filter entweder mit titel oder untertitel zu einem zeitpunkt. Wie können Sie beides gleichzeitig tun? –

Verwandte Themen