Tengo una entrada que filtra una lista de repetición ng al cambiar. La repetición contiene una gran cantidad de datos y tarda unos segundos en filtrarse por todo. Me gustaría que tuvieran un retraso de 0,5 segundos antes de comenzar el proceso de filtrado. ¿Cuál es la forma correcta en angular para crear este retraso?
Entrada
<input ng-model="xyz" ng-change="FilterByName()" />
Repetir
<div ng-repeat"foo in bar">
<p>{{foo.bar}}</p>
</div>
Función de filtro
$scope.FilterByName = function () {
//Filtering Stuff Here
});
Gracias
$timeout
para 500ms.$scope.FilterByName = function () { $timeout(_filterByName , 500)
$timeout.cancel(timeoutpromise)
si hay un tiempo de espera en curso y se activa otro cambio.Respuestas:
AngularJS 1.3+
Desde AngularJS 1.3, puede utilizar la
debounce
propiedad quengModelOptions
proporciona para lograrlo muy fácilmente sin usar$timeout
en absoluto. He aquí un ejemplo:HTML:
JS:
- O -
Revisa el violín
Antes de AngularJS 1.3
Tendrá que usar $ timeout para agregar un retraso y probablemente con el uso de $ timeout.cancel (previoustimeout) puede cancelar cualquier tiempo de espera anterior y ejecutar el nuevo (ayuda a evitar que el filtrado se ejecute varias veces consecutivas dentro de un intervalo de tiempo)
Aquí hay un ejemplo:
fuente
ng-model-options
solo se agregó en Angular v1.3 (y la propiedad antirrebote en beta.8 ). Aquellos que todavía necesiten usar una versión anterior de Angular deberán recurrir a otras soluciones, como la de PSL, o mediante el uso de un módulo externo como ng-debounce .Puede usar
$timeout
para agregar un retraso y probablemente con el uso de$timeout.cancel(previoustimeout)
puede cancelar cualquier tiempo de espera anterior y ejecutar el nuevo (ayuda a evitar que el filtrado se ejecute varias veces consecutivas dentro de un intervalo de tiempo)Ejemplo:-
Plnkr
fuente
ng-change
cuando no quiero eliminar el rebote del modelo.Sé que la pregunta es demasiado antigua. Pero aún quiero proporcionar una forma más rápida de lograr esto mediante la eliminación de rebotes .
Entonces el código se puede escribir como
Debounce tomará el número en milisegundos.
fuente
o puede usar la directiva 'typeahead-wait-ms = "1000"' de angular-ui
fuente