J'ai un champ input
, où je veux appliquer la variante de ngChange
.
Le champ input
est une sorte de liaison avec un appel ajax, lorsque l'utilisateur modifie l'entrée, le côté serveur traitera les données, cependant, je ne veux pas faire l'appel trop souvent.
Supposons que l'utilisateur souhaite entrer une chaîne vraiment, je veux que l'appel ne soit effectué qu'après que l'utilisateur a fini le mot qu'il est sur le point de taper. Néanmoins, je ne veux pas utiliser d'événements tels que le flou. Quelle serait une meilleure façon de mettre en œuvre cela, plutôt que setTimeout
?
Utilisation ng-model-options
in Angular> 1,3
<input type="text"
ng-model="vm.searchTerm"
ng-change="vm.search(vm.searchTerm)"
ng-model-options="{debounce: 750}" />
Sans pour autant ng-model-options
- En balisage:
<input ng-change="inputChanged()">
Dans votre contrôleur/portée de support
var inputChangedPromise;
$scope.inputChanged = function(){
if(inputChangedPromise){
$timeout.cancel(inputChangedPromise);
}
inputChangedPromise = $timeout(taskToDo,1000);
}
Ensuite, votre taskToDo
ne fonctionnera qu'après 1000 ms sans modifications.
À partir de Angular 1.3, vous pouvez utiliser Angular ng-model-options directive
<input ng-change="inputChanged()" ng-model-options="{debounce:1000}">
Écrivez votre propre directive - cela exécutera uniquement les commandes sur myText en fonction des conditions que vous définissez
<input my-change-directive type="text ng-model="myText" />
.directive('myChangeDirective',function() {
return {
require : 'ngModel',
link : function($scope,$element,$attrs) {
var stringTest = function(_string) {
//test string here, return true
//if you want to process it
}
$element.bind('change',function(e) {
if(stringTest($attrs.ngModel) === true) {
//make ajax call here
//run $scope.$apply() in ajax callback if scope is changed
}
});
}
}
})