Eu tenho uma entrada que filtra uma lista de repetição de ng na mudança. A repetição contém muitos dados e leva alguns segundos para filtrar tudo. Eu gostaria que houvesse um atraso de 0,5 segundo antes de iniciar o processo de filtragem. Qual é a maneira correta no angular de criar esse atraso?
Entrada
<input ng-model="xyz" ng-change="FilterByName()" />
Repetir
<div ng-repeat"foo in bar">
<p>{{foo.bar}}</p>
</div>
Função de Filtro
$scope.FilterByName = function () {
//Filtering Stuff Here
});
obrigado
$timeout
por 500ms.$scope.FilterByName = function () { $timeout(_filterByName , 500)
$timeout.cancel(timeoutpromise)
se um tempo limite estiver em andamento e outra alteração for acionada.Respostas:
AngularJS 1.3+
Desde o AngularJS 1.3 você pode utilizar a
debounce
propriedadengModelOptions
fornecidas para conseguir isso de forma muito fácil, sem usar$timeout
nada. Aqui está um exemplo:HTML:
JS:
- OU -
Verifique o violino
Antes do AngularJS 1.3
Você terá que usar $ timeout para adicionar um atraso e provavelmente com o uso de $ timeout.cancel (previoustimeout) você pode cancelar qualquer timeout anterior e executar o novo (ajuda a evitar que a filtragem seja executada várias vezes consecutivas dentro de um intervalo de tempo)
Aqui está um exemplo:
fonte
ng-model-options
só foi adicionado no Angular v1.3 (e a propriedade debounce no beta.8 ). Quem ainda precisar de uma versão anterior do Angular terá que recorrer a outras soluções, como a do PSL, ou a um módulo externo como o ng-debounce .Você pode usar
$timeout
para adicionar um atraso e provavelmente com o uso de$timeout.cancel(previoustimeout)
você pode cancelar qualquer tempo limite anterior e executar o novo (ajuda a evitar que a filtragem seja executada várias vezes consecutivas dentro de um intervalo de tempo)Exemplo:-
Plnkr
fonte
ng-change
quando não quero debounce do modelo.Eu sei que a pergunta é muito antiga. Mas ainda quero fornecer uma maneira mais rápida de conseguir isso usando o debouncing .
Portanto, o código pode ser escrito como
Debounce levará o número em milissegundos.
fonte
ou você pode usar a diretiva 'typeahead-wait-ms = "1000"' do angular-ui
fonte