J'utilise le $http
service d'AngularJS pour faire une demande Ajax.
Comment afficher un GIF spinner (ou un autre type d'indicateur occupé) pendant l'exécution de la demande Ajax?
Je ne vois rien de tel ajaxstartevent
dans la documentation AngularJS.
angularjs
ajax
busyindicator
Ajay Beniwal
la source
la source
Réponses:
Voici les
courspassés AngularJS enchantements:Voici le reste (HTML / CSS) .... en utilisant
pour l'activer. REMARQUE: ce qui précède est utilisé dans le module angulaire au début du post
la source
angular.element('#mydiv').show()
place de$('#mydiv').show()
ng-class
directive au lieu d'utiliser JQuery pour afficher et masquer des éléments?Cela dépend vraiment de votre cas d'utilisation spécifique, mais un moyen simple suivrait un modèle comme celui-ci:
Et puis réagissez-y dans votre modèle:
la source
loading
un entier$scope.loading = 0;
, quand une demande commence$scope.loading++;
et quand elle se termine$scope.loading--;
. Et il n'y a rien à changer dans le modèle. Ainsi, le spinner est affiché lorsqu'il y a au moins une demande en cours, et est caché le reste du temps$scope.loading = false
à la fois le succès et l'échec de rappel, est de le mettre dans le.finally()
. Cela ressemblerait à:mySvc.get().then(success, fail).finally(function() { $scope.loading = false; });
Voici une version utilisant un
directive
etng-hide
.Cela montrera le chargeur pendant tous les appels via le
$http
service angulaire .Dans le modèle:
<div class="loader" data-loading></div>
directif:
en utilisant la
ng-hide
classe sur l'élément, vous pouvez éviter jquery.Personnaliser: ajoutez un
interceptor
Si vous créez un intercepteur de chargement, vous pouvez afficher / masquer le chargeur en fonction d'une condition.
directif:
intercepteur:
spinner
quandresponse.background === true;
request
et / ouresponse
définir$rootScope.$broadcast("loader_show");
ou$rootScope.$broadcast("loader_hide");
plus d'informations sur l'écriture d'un intercepteur
la source
$http
n'importe quel service.Si vous utilisez ngResource, l'attribut $ resolu d'un objet est utile pour les chargeurs:
Pour une ressource comme suit:
Vous pouvez lier un chargeur à l'attribut $ resolu de l'objet ressource:
la source
https://github.com/wongatech/angular-http-loader est un bon projet pour cela.
Exemple ici http://wongatech.github.io/angular-http-loader/
Le code ci-dessous montre un exemple de modèle / loader.tpl.html lorsqu'une demande est en cours.
la source
Je viens de découvrir la
angular-busy
directive qui montre un petit chargeur en fonction d'un appel asynchrone.Par exemple, si vous devez faire une
GET
référence à la promesse dans votre$scope
,et appelez-le ainsi:
Voici le GitHub.
Vous pouvez également l'installer en utilisant
bower
(n'oubliez pas de mettre à jour les dépendances de votre projet):la source
Si vous enveloppez vos appels API dans un service / usine, vous pouvez y suivre le compteur de chargement (par réponse et excellente suggestion simultanée de @JMaylin), et référencer le compteur de chargement via une directive. Ou toute combinaison de ceux-ci.
API WRAPPER
DIRECTIVE SPINNER
USAGE
la source
Pour les chargements de page et les modaux, le moyen le plus simple consiste à utiliser la
ng-show
directive et à utiliser l'une des variables de données d'étendue. Quelque chose comme:Ici, bien que ce ne
someObject
soit pas défini, le spinner s'affiche. Une fois que le service revient avec des données etsomeObject
est rempli, le spinner revient à son état caché.la source
C'est le moyen le plus simple d'ajouter un spinner, je suppose: -
Vous pouvez utiliser ng-show avec la balise div de l'un de ces magnifiques filateurs http://tobiasahlin.com/spinkit/ {{Ce n'est pas ma page}}
puis vous pouvez utiliser ce genre de logique
la source
Ajoutez ce css:
Et juste dans votre angulaire, ajoutez:
$ rootScope.loading = false; $ rootScope.loading = true; -> lorsque $ http.get se termine.
la source
Partage de ma version de l'excellente réponse de @bulltorious, mise à jour pour les nouvelles versions angulaires (j'ai utilisé la version 1.5.8 avec ce code), et a également incorporé l'idée de @ JMaylin d'utiliser un compteur afin d'être robuste à plusieurs demandes simultanées, et la option pour ignorer l'affichage de l'animation pour les demandes prenant moins d'un certain nombre minimum de millisecondes:
la source
Vous pouvez utiliser un intercepteur angulaire pour gérer les appels de requête http
https://stackoverflow.com/a/49632155/4976786
la source
Manière simple sans intercepteurs ou jQuery
C'est un moyen simple de montrer un spinner qui ne nécessite pas de bibliothèque tierce, d'intercepteurs ou de jQuery.
Dans le contrôleur, définissez et réinitialisez un indicateur.
Dans le HTML, utilisez l'indicateur:
L'
vm.starting
indicateur est défini autrue
démarrage du XHR et effacé à la fin du XHR.la source
Cela fonctionne bien pour moi:
HTML:
Angulaire:
Alors que la promesse retournée par $ http est en attente, ng-show l'évaluera comme "véridique". Ceci est automatiquement mis à jour une fois la promesse résolue ... c'est exactement ce que nous voulons.
la source
Intercepteur suivant utilisé pour afficher la barre de chargement sur demande http
la source
la source
créer une directive avec ce code:
la source
Une autre solution pour afficher le chargement entre les différents changements d'URL est:
Et puis dans le balisage, basculez simplement le spinner avec
ng-show="loading"
.Si vous voulez l'afficher sur les demandes ajax, ajoutez simplement
$scope.loading++
quand la demande commence et quand elle se termine, ajoutez$scope.loading--
.la source
Vous pouvez également essayer quelque chose comme ça:
Créer une directive:
Ensuite, vous ajoutez quelque chose comme ça à mainCtrl
Et HTML peut ressembler à ceci:
la source
La manière suivante prendra note de toutes les demandes et ne se masquera qu'une fois toutes les demandes terminées:
la source
Depuis que la fonctionnalité de position: fixed a changé récemment, j'ai eu du mal à montrer le chargeur gif au-dessus de tous les éléments, j'ai donc dû utiliser jQuery intégré d'angular .
Html
Css
Manette
J'espère que cela t'aides :)
la source
Toutes les réponses sont ou trop compliquées, ou doivent définir des variables à chaque demande, ce qui est une très mauvaise pratique si nous connaissons le concept DRY. Voici un exemple d'intercepteur simple, je mets la souris en attente lorsque ajax démarre et la règle sur auto lorsque ajax se termine.
Le code doit être ajouté dans la configuration de l'application
app.config
. J'ai montré comment changer la souris sur l'état de chargement, mais là-dedans, il est possible d'afficher / masquer tout contenu du chargeur, ou d'ajouter, supprimer certaines classes CSS qui montrent le chargeur.Interceptor s'exécutera à chaque appel ajax, donc pas besoin de créer de variables booléennes spéciales ($ scope.loading = true / false etc.) à chaque appel http.
la source
Voici mon implémentation, aussi simple qu'un ng-show et un compteur de requêtes.
Il utilise un nouveau service pour toute demande de $ http:
Et puis vous pouvez utiliser votre base de chargeur sur le nombre d'appels en cours:
la source
si vous souhaitez afficher le chargeur pour chaque appel de requête http, vous pouvez utiliser un intercepteur angulaire pour gérer les appels de requête http,
voici un exemple de code
la source
Utilisez simplement ng-show et un booléen
Pas besoin d'utiliser une directive, pas besoin de se compliquer.
Voici le code à mettre à côté du bouton soumettre ou où vous voulez que le spinner soit:
Et puis dans votre contrôleur:
la source
Voici ma solution qui, je pense, est beaucoup plus facile que l'autre publiée ici. Je ne sais pas à quel point c'est "joli", mais cela a résolu tous mes problèmes
J'ai un style CSS appelé "chargement"
Le code HTML pour la div de chargement peut être n'importe quoi, mais j'ai utilisé quelques icônes FontAwesome et la méthode de rotation là-bas:
Sur les éléments que vous souhaitez cacher, écrivez simplement ceci:
et dans la fonction je viens de mettre cela en charge.
J'utilise SignalR donc dans la fonction hubProxy.client.allLocks (quand c'est fait en passant par les verrous)
Cela masque également le {{someField}} lorsque la page se charge, car je mets la classe de chargement en charge et AngularJS la supprime ensuite.
la source