J'ai une entrée qui filtre une liste ng-répétée en cas de changement. La répétition contient beaucoup de données et prend quelques secondes pour tout filtrer. Je voudrais qu'il y ait un délai de 0,5 seconde avant de commencer le processus de filtrage. Quelle est la bonne manière angulaire pour créer ce retard?
Contribution
<input ng-model="xyz" ng-change="FilterByName()" />
Répéter
<div ng-repeat"foo in bar">
<p>{{foo.bar}}</p>
</div>
Fonction de filtre
$scope.FilterByName = function () {
//Filtering Stuff Here
});
Merci
$timeout
pendant 500 ms.$scope.FilterByName = function () { $timeout(_filterByName , 500)
$timeout.cancel(timeoutpromise)
si un délai d'expiration est en cours et qu'une autre modification est déclenchée.Réponses:
AngularJS 1.3+
Depuis AngularJS 1.3, vous pouvez utiliser la
debounce
propriéténgModelOptions
fournit pour y parvenir très facilement sans utiliser$timeout
du tout. Voici un exemple:HTML:
JS:
-- OU --
Vérifiez le violon
Avant AngularJS 1.3
Vous devrez utiliser $ timeout pour ajouter un délai et probablement avec l'utilisation de $ timeout.cancel (previoustimeout), vous pouvez annuler tout timeout précédent et exécuter le nouveau (aide à empêcher le filtrage d'être exécuté plusieurs fois consécutivement dans un intervalle de temps)
Voici un exemple:
la source
ng-model-options
n'a été ajouté que dans Angular v1.3 (et la propriété anti- rebond en beta.8 ). Ceux qui ont encore besoin d'utiliser une ancienne version d'Angular devront recourir à d'autres solutions, comme celle de PSL, ou en utilisant un module externe comme ng-debounce .Vous pouvez utiliser
$timeout
pour ajouter un délai et probablement avec l'utilisation de$timeout.cancel(previoustimeout)
vous pouvez annuler tout délai d'expiration précédent et exécuter le nouveau (aide à empêcher le filtrage d'être exécuté plusieurs fois consécutivement dans un intervalle de temps)Exemple:-
Plnkr
la source
ng-change
lorsque je ne veux pas rebondir le modèle.Je sais que la question est trop ancienne. Mais je veux toujours fournir un moyen plus rapide d'y parvenir en utilisant le débouncing .
Ainsi, le code peut être écrit comme
Le debounce prendra le nombre en millisecondes.
la source
ou vous pouvez utiliser la directive 'typeahead-wait-ms = "1000"' de angular-ui
la source