Bei Verwendung von Angularjs muss ein Ladebildschirm (ein einfacher Drehfeld) angezeigt werden, bis die Ajax-Anforderung abgeschlossen ist. Bitte schlagen Sie eine Idee mit einem Code-Snippet vor.
angularjs
angularjs-directive
Badhrinath Canessane
quelle
quelle
$httpProvider.interceptors
da sie verarbeiten kann, wann eine Ajax-Anforderung beginnt und wann sie endet. Aus diesem Grund muss$watch
nicht mehr erkannt werden, wann ein Ajax-Anruf beginnt und endet.Antworten:
Anstatt eine Bereichsvariable einzurichten, um den Status des Datenladens anzuzeigen, ist es besser, wenn eine Direktive alles für Sie erledigt:
Mit dieser Anweisung müssen Sie lediglich jedem Ladeanimationselement das Attribut "Laden" zuweisen:
Sie können mehrere Ladespinner auf der Seite haben. Wo und wie diese Spinner zu gestalten sind, liegt bei Ihnen. Die Richtlinie schaltet sie einfach automatisch für Sie ein / aus.
quelle
Hier ist ein Beispiel. Es verwendet die einfache ng-show-Methode mit einem Bool.
HTML
ANGULARJS
Natürlich können Sie den HTML-Code der Ladebox in eine Direktive verschieben und dann $ watch für $ scope.loading verwenden. In welchem Fall:
HTML :
ANGULARJS RICHTLINIE :
PLUNK : http://plnkr.co/edit/AI1z21?p=preview
quelle
ui-router
, weiß nicht warumloading=true
nicht gesetzt zu werdenIch benutze dafür ngProgress .
Fügen Sie 'ngProgress' zu Ihren Abhängigkeiten hinzu, sobald Sie die Skript- / CSS-Dateien in Ihren HTML-Code aufgenommen haben. Sobald Sie dies getan haben, können Sie so etwas einrichten, das ausgelöst wird, wenn eine Routenänderung festgestellt wurde.
Für AJAX-Anfragen können Sie Folgendes tun:
Denken Sie daran, den Controller-Abhängigkeiten zuvor 'ngProgress' hinzuzufügen. Wenn Sie mehrere AJAX-Anforderungen ausführen, verwenden Sie eine inkrementelle Variable im Hauptbereich der App, um zu verfolgen, wann Ihre AJAX-Anforderungen abgeschlossen sind, bevor Sie 'ngProgress.complete ();' aufrufen.
quelle
Die Verwendung von pendingRequests ist nicht korrekt, da diese Eigenschaft, wie in der Angular-Dokumentation erwähnt, hauptsächlich für Debugging-Zwecke verwendet werden soll.
Ich empfehle, einen Interceptor zu verwenden, um festzustellen, ob ein Async-Aufruf aktiv ist.
und überprüfen Sie dann mit einer $ watch, ob activeCalls in der Direktive Null ist oder nicht.
quelle
Der beste Weg, dies zu tun, besteht darin, Antwort-Interceptors zusammen mit einer benutzerdefinierten Direktive zu verwenden . Der Prozess kann mithilfe des Pub / Sub- Mechanismus mithilfe der Methoden $ rootScope. $ Broadcast & $ rootScope. $ On weiter verbessert werden .
Da der gesamte Prozess in einem gut geschriebenen Blog-Artikel dokumentiert ist , werde ich das hier nicht noch einmal wiederholen. In diesem Artikel finden Sie Informationen zu Ihrer erforderlichen Implementierung.
quelle
In Bezug auf diese Antwort
https://stackoverflow.com/a/17144634/4146239
Für mich ist dies die beste Lösung, aber es gibt eine Möglichkeit, die Verwendung von jQuery zu vermeiden.
Sie müssen $ (Element) ersetzen .show (); und (Element) .show (); mit $ scope.loadingStatus = 'true'; und $ scope.loadingStatus = 'false';
Dann müssen Sie diese Variable verwenden, um das ng-show-Attribut des Elements festzulegen.
quelle
Typoskript und Winkelimplementierung
Richtlinie
Umfang
Vorlage
quelle
Wenn Sie Restangular verwenden (was fantastisch ist), können Sie während API-Aufrufen eine Animation erstellen. Hier ist meine Lösung. Fügen Sie einen Antwort-Interceptor und einen Anforderungs-Interceptor hinzu, die eine Rootscope-Sendung senden. Erstellen Sie dann eine Anweisung, um auf diese Antwort und Anforderung zu warten:
Hier ist die Richtlinie:
quelle
Fügen Sie dies in Ihre "app.config" ein:
Und fügen Sie diesen Code hinzu:
quelle
Verwenden Sie eckig beschäftigt :
Fügen Sie cgBusy zu Ihrer App / Ihrem Modul hinzu:
Fügen Sie Ihr Versprechen hinzu zu
scope
:In Ihrer HTML-Vorlage:
quelle
Außerdem gibt es eine schöne Demo, die zeigt, wie Sie
Angularjs
Animationen in Ihrem Projekt verwenden können.Der Link ist hier (siehe oben links) .
Es ist eine Open Source. Hier ist der Link zum Download
Und hier ist der Link zum Tutorial ;
Mein Punkt ist, gehen Sie voran und laden Sie die Quelldateien herunter und sehen Sie dann, wie sie den Spinner implementiert haben. Sie hätten vielleicht einen etwas besseren Ansatz gewählt. Schauen Sie sich dieses Projekt an.
quelle
In diesem einfachen Interceptor-Beispiel setze ich die Maus auf Warten, wenn Ajax startet, und auf Auto, wenn Ajax endet.
Code muss in der Anwendungskonfiguration hinzugefügt werden
app.config
. Ich habe gezeigt, wie man die Maus beim Laden ändert, aber dort ist es möglich, Loader-Inhalte ein- / auszublenden oder einige CSS-Klassen hinzuzufügen oder zu entfernen, die den Loader anzeigen.Interceptor wird bei jedem Ajax-Aufruf ausgeführt, sodass bei jedem http-Aufruf keine speziellen booleschen Variablen ($ scope.loading = true / false usw.) erstellt werden müssen.
Interceptor verwendet integriertes eckiges jqLite https://docs.angularjs.org/api/ng/function/angular.element, sodass keine JQuery erforderlich ist.
quelle
Erstellen Sie eine Direktive mit den Attributen show und size (Sie können auch weitere hinzufügen).
und in HTML als verwenden
Übergeben Sie in der show- Variable true, wenn ein Versprechen ausgeführt wird, und machen Sie dies false, wenn die Anforderung abgeschlossen ist. Aktive Demo - Beispieldemo für eine Angular Loader-Direktive in JsFiddle
quelle
Ich habe ein wenig auf der Antwort von @ DavidLin aufgebaut, um sie zu vereinfachen - und die Abhängigkeit von jQuery in der Direktive zu beseitigen . Ich kann bestätigen, dass dies funktioniert, wenn ich es in einer Produktionsanwendung verwende
Ich benutze einen
ng-show
statt eines jQuery-Aufrufs, um das auszublenden / anzuzeigen<div>
.Hier ist das,
<div>
was ich direkt unter dem Eröffnungs-<body>
Tag platziert habe:Und hier ist das CSS, das das Overlay zum Blockieren der Benutzeroberfläche bereitstellt, während ein $ http-Aufruf ausgeführt wird:
Das CSS-Guthaben geht an @Steve Seeger - seinen Beitrag: https://stackoverflow.com/a/35470281/335545
quelle
Sie können eine Bedingung hinzufügen und sie dann über das Rootscope ändern. Vor Ihrer Ajax-Anfrage rufen Sie einfach $ rootScope auf. $ Emit ('stopLoader');
Dies ist definitiv nicht die beste Lösung, aber es würde immer noch funktionieren.
quelle