Usando o Angularjs, preciso mostrar uma tela de carregamento (um botão giratório simples) até que a solicitação ajax seja concluída. Por favor, sugira qualquer ideia com um snippet de código.
angularjs
angularjs-directive
Badhrinath Canessane
fonte
fonte
$httpProvider.interceptors
pois pode controlar quando a solicitação ajax começa e quando termina. É por isso que$watch
não é mais necessário detectar quando a chamada ajax começa e termina.Respostas:
Em vez de configurar uma variável de escopo para indicar o status de carregamento de dados, é melhor ter uma diretiva que faz tudo por você:
Com esta diretiva, tudo o que você precisa fazer é dar a qualquer elemento de animação de carregamento um atributo de 'carregamento':
Você pode ter vários spinners de carregamento na página. onde e como fazer o layout desses spinners depende de você e a diretiva simplesmente ativará / desativará para você automaticamente.
fonte
Aqui está um exemplo. Ele usa o método ng-show simples com um bool.
HTML
ANGULARJS
É claro que você pode mover o código html da caixa de carregamento para uma diretiva e usar $ watch em $ scope.loading. Nesse caso:
HTML :
DIRETIVA ANGULARJS :
PLUNK : http://plnkr.co/edit/AI1z21?p=preview
fonte
ui-router
, não sei por quêloading=true
, não seja definidoEu uso o ngProgress para isso.
Adicione 'ngProgress' às suas dependências depois de incluir os arquivos script / css em seu HTML. Depois de fazer isso, você pode configurar algo assim, que será acionado quando uma mudança de rota for detectada.
Para solicitações AJAX, você pode fazer algo assim:
Apenas lembre-se de adicionar 'ngProgress' às dependências dos controladores antes de fazer isso. E se você estiver fazendo várias solicitações AJAX, use uma variável incremental no escopo do aplicativo principal para controlar quando suas solicitações AJAX terminaram antes de chamar 'ngProgress.complete ();'.
fonte
o uso de pendingRequests não é correto porque, conforme mencionado na documentação do Angular, esta propriedade deve ser usada principalmente para fins de depuração.
O que eu recomendo é usar um interceptor para saber se há alguma chamada Async ativa.
e então verifique se activeCalls é zero ou não na diretiva por meio de um relógio $.
fonte
A melhor maneira de fazer isso é usar interceptores de resposta junto com a diretiva personalizada . E o processo pode ainda ser melhorado usando o mecanismo pub / sub usando os métodos $ rootScope. $ Broadcast & $ rootScope. $ On .
Como todo o processo está documentado em um artigo de blog bem escrito , não vou repetir isso aqui novamente. Consulte esse artigo para sugerir a implementação necessária.
fonte
Em referência a esta resposta
https://stackoverflow.com/a/17144634/4146239
Para mim é a melhor solução, mas há uma maneira de evitar o uso de jQuery.
Você precisa substituir $ (element) .show (); e (elemento) .show (); com $ scope.loadingStatus = 'true'; e $ scope.loadingStatus = 'false';
Então, você precisa usar esta variável para definir o atributo ng-show do elemento.
fonte
Texto datilografado e implementação angular
diretriz
Escopo
Modelo
fonte
Se você estiver usando Restangular (o que é incrível), você pode criar uma animação durante as chamadas de API. Aqui está minha solução. Adicione um interceptor de resposta e um interceptor de solicitação que envia uma transmissão rootcope. Em seguida, crie uma diretiva para ouvir essa resposta e solicitação:
Aqui está a diretiva:
fonte
Inclua isso em seu "app.config":
E adicione este código:
fonte
Use angular-busy :
Adicione cgBusy como ao seu aplicativo / módulo:
Adicione sua promessa de
scope
:Em seu modelo html:
fonte
Além disso, há uma boa demonstração que mostra como você pode usar
Angularjs
animação em seu projeto.O link está aqui (veja o canto superior esquerdo) .
É um código aberto. Aqui está o link para download
E aqui está o link para o tutorial ;
Meu ponto é, vá em frente e baixe os arquivos de origem e, em seguida, veja como eles implementaram o spinner. Eles poderiam ter usado uma abordagem um pouco melhor. Então, dê uma olhada neste projeto.
fonte
Aqui, um exemplo de interceptador simples, eu defino o mouse em espera quando o ajax inicia e o configuro como automático quando o ajax termina.
O código deve ser adicionado na configuração do aplicativo
app.config
. Eu mostrei como mudar o mouse no estado de carregamento, mas lá é possível mostrar / ocultar qualquer conteúdo do carregador, ou adicionar, remover algumas classes css que estão mostrando o carregador.O Interceptor será executado em cada chamada ajax, portanto, não há necessidade de criar variáveis booleanas especiais ($ scope.loading = true / false etc.) em cada chamada http.
O Interceptor está usando construído em angular jqLite https://docs.angularjs.org/api/ng/function/angular.element, então nenhum Jquery necessário.
fonte
Crie uma diretiva com os atributos show e size (você também pode adicionar mais)
e em html usar como
Na variável show , transmita verdadeiro quando qualquer promessa estiver em execução e torne-o falso quando a solicitação for concluída. Demonstração ativa - demonstração de exemplo de diretiva do Angular Loader no JsFiddle
fonte
Desenvolvi um pouco a resposta de @DavidLin para simplificá-la - removendo qualquer dependência de jQuery na diretiva. Posso confirmar que isso funciona porque o uso em um aplicativo de produção
Eu uso um em
ng-show
vez de uma chamada jQuery para ocultar / mostrar o<div>
.Aqui está o
<div>
que coloquei logo abaixo da<body>
tag de abertura :E aqui está o CSS que fornece a sobreposição para bloquear a IU enquanto uma chamada $ http está sendo feita:
O crédito do CSS vai para @Steve Seeger - sua postagem: https://stackoverflow.com/a/35470281/335545
fonte
Você pode adicionar uma condição e alterá-la por meio do escopo de raiz. Antes de sua solicitação ajax, você simplesmente chama $ rootScope. $ Emit ('stopLoader');
Definitivamente, esta não é a melhor solução, mas ainda funciona.
fonte