Używając Angularjs, muszę pokazać ekran ładowania (prosty spinner), dopóki żądanie AJAX nie zostanie zakończone. Zaproponuj dowolny pomysł za pomocą fragmentu kodu.
angularjs
angularjs-directive
Badhrinath Canessane
źródło
źródło
$httpProvider.interceptors
ponieważ może obsługiwać, kiedy żądanie AJAX zaczyna się i kończy. Dlatego$watch
nie ma już potrzeby wykrywania początku i końca wywołania ajax.Odpowiedzi:
Zamiast konfigurować zmienną zakresu, aby wskazywać stan ładowania danych, lepiej jest mieć dyrektywę, która zrobi wszystko za Ciebie:
Dzięki tej dyrektywie wszystko, co musisz zrobić, to nadać dowolnemu elementowi animacji ładowania atrybutu „ładowanie”:
Na stronie możesz mieć wiele pokręteł ładowania. gdzie i jak rozmieścić te przędzarki zależy od Ciebie, a dyrektywa po prostu włączy / wyłączy je automatycznie.
źródło
Oto przykład. Używa prostej metody ng-show z wartością bool.
HTML
ANGULARJS
Oczywiście możesz przenieść kod html pola ładowania do dyrektywy, a następnie użyć $ watch na $ scope.loading. W którym to przypadku:
HTML :
DYREKTYWA ANGULARJS :
PLUNK : http://plnkr.co/edit/AI1z21?p=preview
źródło
ui-router
, nie wiem czemuloading=true
nie jest ustawianeUżywam ngProgress do tego.
Dodaj „ngProgress” do swoich zależności po dołączeniu plików skryptów / css do kodu HTML. Gdy to zrobisz, możesz ustawić coś takiego, co będzie uruchamiane po wykryciu zmiany trasy.
W przypadku żądań AJAX możesz zrobić coś takiego:
Pamiętaj tylko o dodaniu „ngProgress” do zależności kontrolerów, zanim to zrobisz. A jeśli wykonujesz wiele żądań AJAX, użyj zmiennej przyrostowej w głównym zakresie aplikacji, aby śledzić zakończenie żądań AJAX przed wywołaniem „ngProgress.complete ();”.
źródło
używanie pendingRequests nie jest poprawne, ponieważ jak wspomniano w dokumentacji Angular, ta właściwość jest przeznaczona głównie do celów debugowania.
Zalecam użycie przechwytywacza, aby dowiedzieć się, czy jest jakieś aktywne połączenie asynchroniczne.
a następnie sprawdź, czy activeCalls ma wartość zero, czy nie, w dyrektywie za pomocą $ watch.
źródło
Najlepszym sposobem na to jest użycie przechwytywaczy odpowiedzi wraz z dyrektywą niestandardową . Proces można dodatkowo usprawnić za pomocą mechanizmu pub / sub przy użyciu metod $ rootScope. $ Broadcast i $ rootScope. $ On .
Ponieważ cały proces jest udokumentowany w dobrze napisanym artykule na blogu , nie zamierzam już tego tutaj powtarzać. Zapoznaj się z tym artykułem, aby znaleźć potrzebną implementację.
źródło
W nawiązaniu do tej odpowiedzi
https://stackoverflow.com/a/17144634/4146239
Dla mnie to najlepsze rozwiązanie, ale jest sposób na uniknięcie używania jQuery.
Musisz zamienić $ (element) .show (); i (element) .show (); with $ scope.loadingStatus = 'true'; i $ scope.loadingStatus = 'false';
Następnie musisz użyć tej zmiennej, aby ustawić atrybut ng-show elementu.
źródło
Implementacja maszynopisu i kątów
dyrektywa
Zakres
Szablon
źródło
Jeśli używasz Restangular (co jest niesamowite), możesz utworzyć animację podczas wywołań API. Oto moje rozwiązanie. Dodaj przechwytywacz odpowiedzi i przechwytywacz żądania, który wysyła transmisję głównego zakresu. Następnie utwórz dyrektywę, która nasłuchuje tej odpowiedzi i żądania .:
Oto dyrektywa:
źródło
Uwzględnij to w swoim „app.config”:
I dodaj ten kod:
źródło
Użyj angular-busy :
Dodaj cgBusy as do swojej aplikacji / modułu:
Dodaj swoją obietnicę do
scope
:W swoim szablonie HTML:
źródło
Jest też fajne demo, które pokazuje, jak możesz wykorzystać
Angularjs
animację w swoim projekcie.Link jest tutaj (patrz lewy górny róg) .
To open source. Oto link do pobrania
A oto link do samouczka ;
Chodzi mi o to, pobierz pliki źródłowe, a następnie zobacz, jak zaimplementowały spinner. Mogliby użyć trochę lepszego podejścia. Więc sprawdź ten projekt.
źródło
Tutaj prosty przykład przechwytywacza, ustawiam mysz na oczekiwanie, gdy zaczyna się Ajax i ustawiam ją na auto, gdy kończy się Ajax.
Kod należy dodać w konfiguracji aplikacji
app.config
. Pokazałem, jak zmienić stan myszy przy ładowaniu, ale tam można pokazać / ukryć zawartość dowolnego modułu ładującego lub dodać, usunąć niektóre klasy css, które pokazują program ładujący.Interceptor będzie działał przy każdym wywołaniu Ajax, więc nie ma potrzeby tworzenia specjalnych zmiennych boolowskich ($ scope.loading = true / false itp.) Przy każdym wywołaniu http.
Interceptor używa wbudowanego w kątowe jqLite https://docs.angularjs.org/api/ng/function/angular.element, więc nie jest potrzebne Jquery.
źródło
Utwórz dyrektywę z atrybutami show i size (możesz również dodać więcej)
aw html jako
W zmiennej show przekazuj wartość true, gdy obietnica jest uruchomiona i ustaw ją jako fałszywą, gdy żądanie zostanie zakończone. Aktywne demo - przykładowe demo dyrektywy Angular Loader w JsFiddle
źródło
Oparłem się trochę na odpowiedzi @ DavidLin, aby ją uprościć - usuwając w dyrektywie wszelkie zależności od jQuery . Mogę potwierdzić, że to działa, ponieważ używam go w aplikacji produkcyjnej
Używam
ng-show
zamiast wywołania jQuery, aby ukryć / pokazać plik<div>
.Oto,
<div>
który umieściłem tuż pod otwierającym<body>
tagiem:A oto CSS, który zapewnia nakładkę do blokowania interfejsu użytkownika podczas wywołania $ http:
Kredyt CSS trafia do @Steve Seeger's - jego post: https://stackoverflow.com/a/35470281/335545
źródło
Możesz dodać warunek, a następnie zmienić go za pomocą zakresu głównego. Przed żądaniem AJAX po prostu wywołujesz $ rootScope. $ Emit ('stopLoader');
To zdecydowanie nie jest najlepsze rozwiązanie, ale nadal działa.
źródło