Angenommen, ich habe ein Array von 5000 Objekten (mit boolean-Werten), die ich ng-repeat
in der Vorlage haben:Benutzerdefinierte Filter vs Filterfunktion in der Steuerung Leistungsvergleich
$scope.arr = [
{
"value": true
},
{
"value": false
},
{
"value": false
}
//and so on
]
Nun, ich möchte dieses ng-repeated
Array filtern Auf der Grundlage einer dynamischen Variable, sagen wir "show_filter", die ich woanders setze.
Wenn 'show_filter' auf 'all' gesetzt ist, möchte ich alle Objekte anzeigen. Wenn es auf false gesetzt ist (der boolesche Wert), dann möchte ich Objekte mit dem Schlüssel 'value' zeigen, der auf false gesetzt ist. Das gleiche gilt, wenn 'show_filter' auf 'true' gesetzt ist.
So gibt es zwei Ansätze:
1. Erstellen Sie eine benutzerdefinierte Filter:
Ich würde einen benutzerdefinierten Filter für die Filterung Aufgabe wie folgt schreiben:
Filter:
app.filter('filterArr', function() {
return function(arr, show_filter) {
var filtered_arr = [];
if(show_filter != 'All') { //if show_filter is a boolean value
for(var i = 0; i < arr.length; i++) {
if(arr[i].value == show_filter) {
filtered_arr.push(arr[i]);
}
}
return filtered_arr;
}
else {
return arr; //return the entire array if show_filter is set to 'All'
}
}
})
Vorlage:
obj in arr | filterArr : show_filter
2. Schreibe eine Filterfunktion in der Steuerung:
Filter:
$scope.filterObjects = function(arr) {
var filtered_arr = [];
if($scope.show_filter != 'All') { //if $scope.show_filter is a boolean value
for(var i = 0; i < arr.length; i++) {
if(arr[i].value == $scope.show_filter) {
filtered_arr.push(arr[i]);
}
}
return filtered_arr;
}
else {
return arr; //return the entire array if show_filter is set to 'All'
}
}
Vorlage:
obj in filterObjects(arr)
Welche der beiden oben genannten Methoden wird schneller sein? Ich habe gesehen, dass der benutzerdefinierte Filtercode immer für jede Digest-Schleife ausgeführt wird und nicht nur für Änderungen, die an $scope.show_filter
vorgenommen werden, was mich glauben lässt, dass es ziemlich ineffizient ist. Obwohl ich nicht sicher bin, was zwischen den beiden Möglichkeiten schneller ist.
Sie haben zwei identische Funktionen und Sie fragen, welche ist am schnellsten? Wenn du meinst, was am wenigsten oft heißt, hast du vielleicht schon deine Frage beantwortet? – davidkonrad
Ich weiß nicht, wie oft die zweite Funktion aufgerufen wird. –
Die schnellste Alternative besteht darin, ein gefiltertes Array mit 'ngRepeat' zu versehen. Die zweite aufgerufene Funktion muss in jedem Digest-Zyklus aufgerufen werden. – zeroflagL