Jak wyświetlić ekran ładowania, gdy zmienię trasę w Angular 2?
html
css
angular
angular2-routing
Lucas
źródło
źródło
Odpowiedzi:
Obecny router Angular zapewnia zdarzenia nawigacji. Możesz je zasubskrybować i odpowiednio zmienić interfejs użytkownika. Pamiętaj, aby liczyć w innych wydarzeniach, takich jak
NavigationCancel
iNavigationError
zatrzymać swój spinner w przypadku niepowodzenia przejść między routerami.app.component.ts - Twój główny komponent
app.component.html - Twój widok główny
Poprawiona wydajność Odpowiedź : Jeśli zależy Ci na wydajności, istnieje lepsza metoda, która jest nieco bardziej żmudna do wdrożenia, ale poprawa wydajności będzie warta dodatkowej pracy. Zamiast używać
*ngIf
do warunkowego pokazywania tarczy, moglibyśmy wykorzystać Angular'sNgZone
iRenderer
włączyć / wyłączyć tarczę, która obejdzie wykrywanie zmiany Angulara, gdy zmienimy stan tarczy. Okazało się, że to sprawia, że animacja jest płynniejsza w porównaniu z użyciem*ngIf
lubasync
rury.Jest to podobne do mojej poprzedniej odpowiedzi z kilkoma poprawkami:
app.component.ts - Twój główny komponent
app.component.html - Twój widok główny
źródło
router navigation
iit triggering the spinner
, a następnie nie jest w stanie go powstrzymać.navigationInterceptor
wydaje się rozwiązaniem, ale nie jestem pewien, czy coś innego czeka, aby się zepsuć.async requests
Myślę, że zmieszanie z tym ponownie spowoduje problem.display
albonone
lubinline
.'md-spinner' is not a known element:
. Jestem całkiem nowy w Angular. Czy możesz mi powiedzieć, jaki może być błąd?AKTUALIZACJA: 3 Teraz, gdy zaktualizowałem router do nowego, podejście @borislemke nie będzie działać, jeśli używasz
CanDeactivate
guard. Poniżam moją starą metodęie:
ta odpowiedźUpdate2 wydarzenia router nowego routera i wyglądają obiecująco: odpowiedź przez @borislemke wydaje się obejmować główny aspekt realizacji wirowania, ja havent't przetestowane ale polecam go.
UPDATE1: Napisałem tę odpowiedź w erze
Old-Router
, kiedy było tylko jedno zdarzenieroute-changed
powiadamiane przezrouter.subscribe()
. Czułem również przeciążenie poniższego podejścia i próbowałem to zrobić używając tylkorouter.subscribe()
, ale przyniosło odwrotny skutek, ponieważ nie było sposobu na wykryciecanceled navigation
. Musiałem więc wrócić do długiego podejścia (podwójna praca).Jeśli znasz się na Angular2, to jest to, czego potrzebujesz
Boot.ts
Główny składnik - (MojaAplikacja)
Spinner-Component (subskrybuje usługę Spinner, aby odpowiednio zmienić wartość aktywnego)
Usługa Spinner (uruchom tę usługę)
Zdefiniuj obserwowalny, który ma być subskrybowany przez składnik pokrętła, aby zmienić stan w przypadku zmiany, i użyj funkcji, aby poznać i ustawić pokrętło jako aktywne / nieaktywne.
Składniki wszystkich innych tras
(próba):
źródło
spinner-service
razie potrzebujesz tylko innych części, aby działał. I pamiętaj, że to dlaangular2-rc-1
Dlaczego nie po prostu użyć prostego CSS:
I w twoich stylach:
Lub nawet możemy to zrobić dla pierwszej odpowiedzi:
A potem po prostu
Sztuczka polega na tym, że nowe trasy i komponenty będą zawsze pojawiać się po wyjściu routera , więc za pomocą prostego selektora css możemy pokazać i ukryć ładowanie.
źródło
Jeśli masz specjalną logikę wymaganą tylko dla pierwszej trasy, możesz wykonać następujące czynności:
AppComponent
Musiałem to ukryć stopkę mojej strony, która w przeciwnym razie pojawiałaby się u góry strony. Również jeśli chcesz ładować tylko pierwszą stronę, możesz tego użyć.
źródło
Możesz również skorzystać z tego istniejącego rozwiązania . Demo jest tutaj . Wygląda jak pasek ładowania youtube. Po prostu go znalazłem i dodałem do swojego projektu.
źródło