Estou usando o AngularJS há algum tempo e descobri a necessidade de usar $ timeout de vez em quando (parece ser geralmente iniciar um plugin jQuery).
Recentemente, tenho tentado entender melhor e mais profundamente o ciclo de digestão e deparei-me com a função $ evalAsync .
Parece que essa função produz resultados semelhantes aos $timeout
, apenas você não atrasa. Toda vez que usei $timeout
isso foi com um atraso de 0, então agora estou me perguntando se deveria ter usado $evalAsync
.
Existem diferenças fundamentais entre os dois? Que casos você usaria um sobre o outro? Gostaria de ter uma ideia melhor de quando usar qual deles.
fonte
Para aqueles que desenvolvem aplicativos complexos, esteja ciente de que há um impacto no desempenho de sua escolha. Além disso, gostaria de completar a resposta do Mark com mais detalhes técnicos:
$ timeout (retorno de chamada) aguardará a conclusão do ciclo de resumo atual (ou seja, atualização angular de todo o modelo e do DOM), em seguida, executará seu retorno de chamada - afetando potencialmente o modelo angular - em seguida, lançará um full
$apply
no escopo raiz do $ e redigirá tudo.$ evalAsync (retorno de chamada) , por outro lado, adicionará o retorno de chamada ao ciclo de resumo atual ou próximo. O que significa que se você estiver dentro de um ciclo de resumo (por exemplo, em uma função chamada de alguma
ng-click
diretiva), isso não esperará nada, o código será executado imediatamente. Se você estiver em uma chamada assíncrona, por exemplosetTimeout
, a, um novo ciclo de resumo ($apply
) será acionado.Portanto, em termos de desempenho, é sempre melhor chamar
$evalAsync
, a menos que seja importante para você que a visualização esteja atualizada antes de executar seu código, por exemplo, se você precisar de acesso a algum atributo DOm, como largura dos elementos e afins.Se você quiser obter mais detalhes sobre a distinção entre $ timeout, $ evalAsync, $ digest, $ apply, convido você a ler minha resposta nessa outra pergunta: https://stackoverflow.com/a/23102223/1501926
Leia também a documentação :
fonte
x
diretamente no seu escopo, e não no DOM, para não precisar esperar nada. Além disso, você deve usar melhor ong-style
css do que awidth
propriedade obsoleta . Se precisar de mais ajuda, abra uma nova pergunta no StackOverflow.