En utilisant Angularjs, je dois afficher un écran de chargement (un simple spinner) jusqu'à ce que la requête ajax soit terminée. Veuillez suggérer une idée avec un extrait de code.
angularjs
angularjs-directive
Badhrinath Canessane
la source
la source
$httpProvider.interceptors
car il peut gérer le début et la fin de la requête ajax. C'est pourquoi il$watch
n'est plus nécessaire de détecter le début et la fin de l'appel ajax.Réponses:
Au lieu de configurer une variable de portée pour indiquer l'état de chargement des données, il est préférable qu'une directive fasse tout pour vous:
Avec cette directive, tout ce que vous avez à faire est de donner à tout élément d'animation de chargement un attribut 'loading':
Vous pouvez avoir plusieurs fileurs de chargement sur la page. où et comment mettre en page ces spinners dépend de vous et la directive l'activera / le désactivera automatiquement automatiquement.
la source
Voici un exemple. Il utilise la méthode simple ng-show avec un booléen.
HTML
ANGULARJS
Bien sûr, vous pouvez déplacer le code html de la boîte de chargement dans une directive, puis utiliser $ watch sur $ scope.loading. Dans quel cas:
HTML :
DIRECTIVE ANGULARJS :
PLUNK : http://plnkr.co/edit/AI1z21?p=preview
la source
ui-router
, je ne sais pas pourquoiloading=true
, ne vous mettez pas en placeJ'utilise ngProgress pour cela.
Ajoutez 'ngProgress' à vos dépendances une fois que vous avez inclus les fichiers script / css dans votre HTML. Une fois que vous faites cela, vous pouvez configurer quelque chose comme ça, qui se déclenchera lorsqu'un changement d'itinéraire a été détecté.
Pour les demandes AJAX, vous pouvez faire quelque chose comme ceci:
N'oubliez pas d'ajouter «ngProgress» aux dépendances des contrôleurs avant de le faire. Et si vous effectuez plusieurs requêtes AJAX, utilisez une variable incrémentielle dans la portée principale de l'application pour suivre la fin de vos requêtes AJAX avant d'appeler 'ngProgress.complete ();'.
la source
l'utilisation de pendingRequests n'est pas correcte car, comme mentionné dans la documentation Angular, cette propriété est principalement destinée à être utilisée à des fins de débogage.
Ce que je recommande, c'est d'utiliser un intercepteur pour savoir s'il y a un appel Async actif.
puis vérifiez si activeCalls est égal à zéro ou non dans la directive via un $ watch.
la source
La meilleure façon de faire est d'utiliser des intercepteurs de réponse avec une directive personnalisée . Et le processus peut encore être amélioré en utilisant le mécanisme pub / sub en utilisant les méthodes $ rootScope. $ Broadcast et $ rootScope. $ On .
Comme l'ensemble du processus est documenté dans un article de blog bien écrit , je ne vais pas le répéter ici encore. Veuillez vous référer à cet article pour trouver votre implémentation nécessaire.
la source
En référence à cette réponse
https://stackoverflow.com/a/17144634/4146239
Pour moi, c'est la meilleure solution, mais il existe un moyen d'éviter d'utiliser jQuery.
Vous devez remplacer $ (element) .show (); et (élément) .show (); avec $ scope.loadingStatus = 'true'; et $ scope.loadingStatus = 'false';
Ensuite, vous devez utiliser cette variable pour définir l'attribut ng-show de l'élément.
la source
Implémentation typographique et angulaire
directif
Portée
Modèle
la source
Si vous utilisez Restangular (ce qui est génial), vous pouvez créer une animation pendant les appels API. Voici ma solution. Ajoutez un intercepteur de réponse et un intercepteur de demande qui envoie une diffusion rootscope. Créez ensuite une directive pour écouter cette réponse et cette demande:
Voici la directive:
la source
Incluez ceci dans votre "app.config":
Et ajoutez ce code:
la source
Utilisez angular-busy :
Ajoutez cgBusy à votre application / module:
Ajoutez votre promesse à
scope
:Dans votre modèle html:
la source
En outre, il existe une belle démo qui montre comment utiliser l'
Angularjs
animation dans votre projet.Le lien est ici (voir le coin supérieur gauche) .
C'est une source ouverte. Voici le lien pour télécharger
Et voici le lien pour le tutoriel ;
Mon point est, allez-y et téléchargez les fichiers source, puis voyez comment ils ont implémenté le spinner. Ils auraient peut-être utilisé une approche un peu meilleure. Alors, consultez ce projet.
la source
Voici un exemple d'intercepteur simple, je mets la souris en attente lorsque ajax démarre et je le 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 lors du chargement, mais là-dedans, il est possible d'afficher / masquer le contenu du chargeur, ou d'ajouter, de supprimer certaines classes css qui affichent le chargeur.Interceptor fonctionnera à chaque appel ajax, donc pas besoin de créer des variables booléennes spéciales ($ scope.loading = true / false etc.) à chaque appel http.
Interceptor utilise construit dans angular jqLite https://docs.angularjs.org/api/ng/function/angular.element donc pas besoin de Jquery.
la source
Créez une directive avec les attributs show et size (vous pouvez également en ajouter d'autres)
et en html, utilisez comme
Dans la variable show , passez true lorsqu'une promesse est en cours d'exécution et rendez-la false lorsque la demande est terminée. Démo active - Exemple de démonstration de la directive Angular Loader dans JsFiddle
la source
J'ai construit un peu sur la réponse de @ DavidLin pour la simplifier - en supprimant toute dépendance à jQuery dans la directive. Je peux confirmer que cela fonctionne car je l'utilise dans une application de production
J'utilise un
ng-show
au lieu d'un appel jQuery pour masquer / afficher le fichier<div>
.Voici le
<div>
que j'ai placé juste en dessous de la<body>
balise d' ouverture :Et voici le CSS qui fournit la superposition pour bloquer l'interface utilisateur lors d'un appel $ http:
Le crédit CSS revient à @Steve Seeger's - son message: https://stackoverflow.com/a/35470281/335545
la source
Vous pouvez ajouter une condition puis la modifier via le rootscope. Avant votre requête ajax, vous appelez simplement $ rootScope. $ Emit ('stopLoader');
Ce n'est certainement pas la meilleure solution mais cela fonctionnerait toujours.
la source