Supponiamo che io sono un array di 5000 oggetti (con valori booleani) che devo ng-repeat
nel modello:Filtro personalizzato vs funzione di filtro rispetto prestazioni del controller
$scope.arr = [
{
"value": true
},
{
"value": false
},
{
"value": false
}
//and so on
]
Ora, voglio filtrare questo array ng-repeated
sulla base di una variabile dinamica, dite "show_filter", che sto impostando altrove.
Se "show_filter" è impostato su "all", voglio mostrare tutti gli oggetti. Se è impostato su false (il valore booleano), voglio mostrare gli oggetti con la chiave 'value' impostata su false. Lo stesso vale per quando "show_filter" è impostato su true.
Quindi, ci sono due approcci:
1. costruire un filtro personalizzato:
vorrei scrivere un filtro personalizzato per l'attività di filtraggio in questo modo:
filtro:
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'
}
}
})
modello:
obj in arr | filterArr : show_filter
2. scrivere una funzione di filtro nel controller:
filtro:
$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'
}
}
modello:
obj in filterObjects(arr)
Quale dei due metodi precedenti sarà più veloce? Ho visto il codice filtro personalizzato eseguito ogni volta per ogni ciclo di digest e non solo per le modifiche apportate a $scope.show_filter
, il che mi fa pensare che sia piuttosto inefficiente. Anche se non sono sicuro quale sia più veloce tra i due modi.
Hai due funzioni identiche e chiedi quale è il più veloce? Se intendi quale è chiamato il minor numero di volte, allora forse hai già risposto alla tua domanda? – davidkonrad
Non so quante volte viene chiamata la seconda funzione. –
L'alternativa più veloce è quella di esporre un array filtrato a 'ngRepeat'. La seconda funzione deve essere chiamata essere chiamata in ogni ciclo di digestione. L'array – zeroflagL