Estou usando o $http
serviço do AngularJS para fazer uma solicitação do Ajax.
Como um GIF giratório (ou outro tipo de indicador de ocupado) pode ser mostrado enquanto a solicitação do Ajax está em execução?
Não vejo nada parecido com um ajaxstartevent
na documentação do AngularJS.
angularjs
ajax
busyindicator
Ajay Beniwal
fonte
fonte
Respostas:
Aqui estão os encantamentos passados
atuais doAngularJS:Aqui está o resto (HTML / CSS) .... usando
para alternar. NOTA: o acima é usado no módulo angular no início do post
fonte
angular.element('#mydiv').show()
vez de$('#mydiv').show()
ng-class
diretiva em vez de usar o JQuery para mostrar e ocultar elementos?Isso realmente depende do seu caso de uso específico, mas uma maneira simples seguiria um padrão como este:
E então reaja a ele no seu modelo:
fonte
loading
como um número inteiro$scope.loading = 0;
, quando uma solicitação é iniciada$scope.loading++;
e quando termina$scope.loading--;
. E não há nada para mudar no modelo. Então, o spinner é exibido quando há pelo menos um pedido em andamento, e está escondido o resto do tempo$scope.loading = false
o retorno de chamada com êxito e com falha, é colocá-lo no.finally()
. Seria parecido com:mySvc.get().then(success, fail).finally(function() { $scope.loading = false; });
Aqui está uma versão usando a
directive
eng-hide
.Isso mostrará o carregador durante todas as chamadas via
$http
serviço da angular .No modelo:
<div class="loader" data-loading></div>
directiva:
usando a
ng-hide
classe no elemento, você pode evitar o jquery.Personalizar: adicione um
interceptor
Se você criar um interceptador de carregamento, poderá mostrar / ocultar o carregador com base em uma condição.
directiva:
interceptor:
spinner
quandoresponse.background === true;
request
e / ouresponse
definir$rootScope.$broadcast("loader_show");
ou$rootScope.$broadcast("loader_hide");
mais informações sobre como escrever um interceptador
fonte
$http
em qualquer serviço.Se você estiver usando ngResource, o atributo $ resolved de um objeto é útil para carregadores:
Para um recurso da seguinte maneira:
Você pode vincular um carregador ao atributo $ resolved do objeto de recurso:
fonte
https://github.com/wongatech/angular-http-loader é um bom projeto para isso.
Exemplo aqui http://wongatech.github.io/angular-http-loader/
O código abaixo mostra um exemplo de modelo / loader.tpl.html quando uma solicitação está acontecendo.
fonte
Acabei de descobrir o
angular-busy
diretiva que mostra um pequeno carregador dependendo de alguma chamada assíncrona.Por exemplo, se você precisar fazer um
GET
, faça referência à promessa em seu$scope
,e chame assim:
Aqui está o GitHub.
Você também pode instalá-lo usando
bower
(não se esqueça de atualizar as dependências do seu projeto):fonte
Se você estiver encerrando suas chamadas de API em um serviço / fábrica, poderá rastrear o contador de carregamento lá (por resposta e excelente sugestão simultânea de @JMaylin) e referenciar o contador de carregamento por meio de uma diretiva. Ou qualquer combinação dos mesmos.
API WRAPPER
DIRETIVA SPINNER
USO
fonte
Para carregamentos de páginas e modais, a maneira mais fácil é usar a
ng-show
diretiva e usar uma das variáveis de dados do escopo. Algo como:Aqui, enquanto
someObject
estiver indefinido, o botão giratório será exibido. Quando o serviço retornar com dados esomeObject
for preenchido, o botão giratório retornará ao seu estado oculto.fonte
Esta é a maneira mais fácil de adicionar um spinner, eu acho:
Você pode usar o ng-show com a tag div de qualquer um desses belos spinners http://tobiasahlin.com/spinkit/ {{Esta não é minha página}}
e então você pode usar esse tipo de lógica
fonte
Adicione este css:
E apenas no seu angular adicione:
$ rootScope.loading = false; $ rootScope.loading = true; -> quando $ http.get terminar.
fonte
Compartilhando minha versão da ótima resposta de @bulltorious, atualizada para novas construções angulares (usei a versão 1.5.8 com este código) e também incorporei a idéia de @ JMaylin de usar um contador para ser robusto a várias solicitações simultâneas e o opção para pular a exibição da animação para solicitações que levam menos que um número mínimo de milissegundos:
fonte
Você pode usar o interceptor angular para gerenciar chamadas de solicitação http
https://stackoverflow.com/a/49632155/4976786
fonte
Maneira simples, sem interceptadores ou jQuery
Esta é uma maneira simples de mostrar um botão giratório que não requer uma biblioteca de terceiros, interceptores ou jQuery.
No controlador, defina e redefina um sinalizador.
No HTML, use o sinalizador:
O
vm.starting
sinalizador é definidotrue
quando o XHR é iniciado e limpo quando o XHR é concluído.fonte
Isto funciona bem para mim:
HTML:
Angular:
Enquanto a promessa retornada de $ http estiver pendente, o ng-show o avaliará como "verdadeiro". Isso é atualizado automaticamente quando a promessa é resolvida ... e é exatamente isso que queremos.
fonte
Usado após o interceptador para mostrar a barra de carregamento na solicitação http
fonte
fonte
crie uma diretiva com este código:
fonte
Outra solução para mostrar o carregamento entre diferentes alterações de URL é:
E então, na marcação, apenas alterne o botão giratório com
ng-show="loading"
.Se você deseja exibi-lo em solicitações ajax, basta adicionar
$scope.loading++
quando a solicitação iniciar e quando terminar adicionar$scope.loading--
.fonte
Você pode tentar algo assim também:
Criar diretiva:
Então você adiciona algo assim ao mainCtrl
E o HTML pode ficar assim:
fonte
A maneira a seguir anotará todas as solicitações e ocultará apenas quando todas as solicitações forem concluídas:
fonte
Como a funcionalidade position: fixed mudou recentemente, tive dificuldade em mostrar o gif loader acima de todos os elementos, então tive que usar o jQuery embutido da angular .
Html
Css
Controlador
Espero que isto ajude :)
fonte
Todas as respostas são complicadas ou precisam definir algumas variáveis em cada solicitação, o que é uma prática muito errada se conhecermos o conceito DRY. Aqui, como exemplo simples de interceptor, defino o mouse em espera quando o ajax é iniciado e defino-o 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 é possível mostrar / ocultar qualquer conteúdo do carregador ou adicionar ou remover algumas classes de css que estão mostrando o carregador.O Interceptor será executado em todas as chamadas ajax, portanto, não há necessidade de criar variáveis booleanas especiais ($ scope.loading = true / false etc.) em todas as chamadas http.
fonte
Aqui está minha implementação, tão simples quanto um ng-show e um contador de solicitações.
Ele usa um novo serviço para todas as solicitações de $ http:
E então você pode usar sua base de carregadores no número de chamadas atuais:
fonte
se você quiser mostrar o carregador para cada chamada de solicitação http, poderá usar o interceptor angular para gerenciar chamadas de solicitação http,
aqui está um código de exemplo
fonte
Basta usar ng-show e um booleano
Não há necessidade de usar uma diretiva, não há necessidade de se complicar.
Aqui está o código para colocar ao lado do botão enviar ou onde você quiser que o botão giratório esteja:
E então no seu controlador:
fonte
Aqui está a minha solução que eu sinto é muito mais fácil do que o outro postado aqui. Não tenho certeza de quão "bonita" é, mas resolveu todos os meus problemas
Eu tenho um estilo css chamado "loading"
O html para a div de carregamento pode ser o que for, mas usei alguns ícones FontAwesome e o método de rotação lá:
Nos elementos que você deseja ocultar, basta escrever o seguinte:
e na função eu apenas defino isso na carga.
Estou usando o SignalR, então na função hubProxy.client.allLocks (quando terminar de passar pelos bloqueios), coloquei
Isso também oculta o {{someField}} quando a página está carregando, pois estou configurando a classe loading em load e o AngularJS a remove posteriormente.
fonte