Ich habe ein Datenarray, das viele Objekte enthält (JSON-Format). Als Inhalt dieses Arrays kann Folgendes angenommen werden:
var data = [
{
"name": "Jim",
"age" : 25
},
{
"name": "Jerry",
"age": 27
}
];
Jetzt zeige ich diese Details wie folgt an:
<div ng-repeat="person in data | filter: query">
</div
Hier wird die Abfrage in ein Eingabefeld modelliert, in dem der Benutzer die angezeigten Daten einschränken kann.
Jetzt habe ich einen anderen Ort, an dem ich die aktuelle Anzahl der angezeigten Personen / Personen anzeige, d. H. Showing {{data.length}} Persons
Was ich tun möchte, ist, dass, wenn der Benutzer nach einer Person sucht und die angezeigten Daten basierend auf der Abfrage gefiltert werden, sich Showing...persons
auch der Wert der aktuell angezeigten Personen ändert. Aber es passiert nicht. Es werden immer die Gesamtzahl der Personen in den Daten angezeigt und nicht die gefilterten. Wie erhalte ich die Anzahl der gefilterten Daten?
quelle
$scope.filtered.length
.undefined
, wahrscheinlich, weil die Variable zum Zeitpunkt der Protokollierung noch nicht definiert ist. Wie würde ich also sicherstellen, dass der Code in der Steuerung ausgeführt wird, nachdem die Variable definiert und der Filter in der Ansicht angewendet wurde?$scope.$watch('filtered', function() { console.log('filtered:', $scope.filtered); });
person in data | filter:query as filtered | limitTo:5
. Also musste ich die Version vor 1.3 verwenden:person in filtered = (data | filter: query) | limitTo: 5
Der Vollständigkeit halber können Sie zusätzlich zu früheren Antworten (Berechnung der sichtbaren Personen innerhalb des Controllers durchführen) diese Berechnungen auch in Ihrer HTML-Vorlage durchführen, wie im folgenden Beispiel.
Angenommen, Ihre Personenliste ist
data
variabel und Sie filtern Personen anhand desquery
Modells. Der folgende Code funktioniert für Sie:{{data.length}}
- druckt die Gesamtzahl der Personen{{(data|filter:query).length}}
- druckt die gefilterte Anzahl von PersonenBeachten Sie, dass diese Lösung einwandfrei funktioniert, wenn Sie gefilterte Daten nur einmal auf einer Seite verwenden möchten . Wenn Sie jedoch gefilterte Daten mehrmals verwenden, z. B. um Elemente anzuzeigen und die Länge der gefilterten Liste anzuzeigen , würde ich empfehlen, den Alias-Ausdruck (unten beschrieben) für AngularJS 1.3+ oder die von @Wumms für AngularJS vor 1.3 vorgeschlagene Lösung zu verwenden.
Neues Feature in Angular 1.3
AngularJS-Ersteller bemerkten auch dieses Problem und fügten in Version 1.3 (Beta 17) den Ausdruck "Alias" hinzu, der die Zwischenergebnisse des Repeaters speichert, nachdem die Filter angewendet wurden, z
Der Alias-Ausdruck verhindert das Problem der Ausführung mehrerer Filter.
Ich hoffe das wird helfen.
quelle
{{(data|filter:query|filter:query2).length}}
Der einfachste Weg, wenn Sie haben
Gefilterte Datenlänge
quelle
ngRepeat erstellt eine Kopie des Arrays, wenn ein Filter angewendet wird. Sie können das Quellarray also nicht verwenden, um nur auf die gefilterten Elemente zu verweisen.
In Ihrem Fall ist es möglicherweise besser, den Filter mithilfe des
$filter
Dienstes in Ihrem Controller anzuwenden :Und dann verwenden Sie
filteredData
stattdessen die Eigenschaft in Ihrer Ansicht. Hier ist ein funktionierender Plunker: http://plnkr.co/edit/7c1l24rPkuKPOS5o2qtx?p=previewquelle
{{filteredData.length}}
stattdata.length
. Ich habe auch verstanden, dass diesmyInputModel
das Modell ist, das der Eingabeabfrage zugeordnet ist, die die Daten filtert.val
wäre der Text, der in die Eingabe eingegeben wird (im Grunde Abfrage), aber jedes Mal, wenn ich tippe, ändert er sich. Aber was istfilterFilter
hier? Ich könnte hinzufügen, dass ich meinen eigenen customFilter erstellt habe (wobei ich angeben kann, welcher Schlüssel des Objekts für die Filterung berücksichtigt werden soll).ng-repeat="person in filteredData"
es auch einfach, da es keinen Sinn macht, es zweimal zu filtern. Mit dem$filter
Service können Sie für einen bestimmten Filter fragen nach suffixing es nur mit „Filter“, zum Beispiel:dateFilter
,jsonFilter
usw. Wenn Sie Ihre eigenen benutzerdefinierten Filter verwenden, verwenden Sie nur , dass man anstelle der allgemeinenfilterFilter
.Seit AngularJS 1.3 können Sie Aliase verwenden:
und irgendwo:
Aus Dokumenten :
quelle
$scope.$watch
auf dieses Alias-Ergebnis bewerben . Irgendwelche Tipps für$broadcast
die Alias-results
Variable?Es ist auch nützlich zu beachten, dass Sie mehrere Gruppenebenen speichern können, indem Sie Filter gruppieren
Hier ist eine Demo-Geige
quelle
Hier ist Beispiel gearbeitet Siehe auf Plunker
quelle
Sie können es auf zwei Arten tun . In Vorlage und in Controller . In der Vorlage können Sie Ihr gefiltertes Array auf eine andere Variable setzen und dann wie gewünscht verwenden. So geht's:
Wenn Sie Beispiele benötigen, lesen Sie die AngularJs-Beispiele / Demos für die gefilterte Anzahl
quelle