Wie zeige ich einen Ladebildschirm an, wenn ich eine Route in Angular 2 ändere?
html
css
angular
angular2-routing
Lucas
quelle
quelle
Antworten:
Der aktuelle Angular Router bietet Navigationsereignisse. Sie können diese abonnieren und entsprechende Änderungen an der Benutzeroberfläche vornehmen. Denken Sie daran, bei anderen Ereignissen zu zählen, z. B.
NavigationCancel
undNavigationError
Ihren Spinner zu stoppen, falls Routerübergänge fehlschlagen.app.component.ts - Ihre Stammkomponente
app.component.html - Ihre Stammansicht
Antwort zur Leistungsverbesserung : Wenn Sie sich für die Leistung interessieren, gibt es eine bessere Methode. Die Implementierung ist etwas mühsamer, aber die Leistungsverbesserung ist die zusätzliche Arbeit wert. Anstatt
*ngIf
den Spinner bedingt anzuzeigen, könnten wir Angulars nutzenNgZone
undRenderer
den Spinner ein- und ausschalten, wodurch die Änderungserkennung von Angular umgangen wird, wenn wir den Status des Spinners ändern. Ich fand dies, um die Animation im Vergleich zur Verwendung*ngIf
oder einerasync
Pipe flüssiger zu machen .Dies ähnelt meiner vorherigen Antwort mit einigen Verbesserungen:
app.component.ts - Ihre Stammkomponente
app.component.html - Ihre Stammansicht
quelle
router navigation
undit triggering the spinner
dann nicht aufhören zu können.navigationInterceptor
scheint eine Lösung zu sein, aber ich bin mir nicht sicher, ob etwas anderes darauf wartet, kaputt zu gehen. Wenn es mit dem gemischtasync requests
wird, wird es das Problem wieder einführen, denke ich.display
entwedernone
oder zu verwendeninline
.'md-spinner' is not a known element:
. Ich bin ziemlich neu in Angular. Könnten Sie mir bitte sagen, was der Fehler sein könnte?UPDATE: 3 Nachdem ich auf einen neuen Router aktualisiert habe , funktioniert der Ansatz von @borislemke nicht, wenn Sie
CanDeactivate
Guard verwenden. Ich erniedrige mich zu meiner alten Methode,ie:
dieser AntwortUPDATE2 : Router-Ereignisse in New-Router sehen vielversprechend aus und die Antwort von @borislemke scheint den Hauptaspekt der Spinner-Implementierung abzudecken. Ich habe es nicht getestet, aber ich empfehle es.
UPDATE1: Ich habe diese Antwort in der Zeit geschrieben
Old-Router
, als es nur ein Ereignis gabroute-changed
, über das benachrichtigt wurderouter.subscribe()
. Ich fühlte auch eine Überlastung des folgenden Ansatzes und versuchte, ihn nur mit zu verwendenrouter.subscribe()
, und er schlug fehl, weil es keine Möglichkeit gab, ihn zu erkennencanceled navigation
. Also musste ich zu einem langwierigen Ansatz zurückkehren (Doppelarbeit).Wenn Sie sich in Angular2 auskennen, ist dies das, was Sie brauchen
Boot.ts
Root Component- (MyApp)
Spinner-Komponente (abonniert den Spinner-Service, um den Wert von active entsprechend zu ändern)
Spinner-Service (Bootstrap diesen Service)
Definieren Sie eine Observable, die von der Spinner-Komponente abonniert werden soll, um den Status bei Änderung zu ändern, und die Funktion, um den Spinner zu kennen und aktiv / inaktiv zu setzen.
Alle anderen Routenkomponenten
(Stichprobe):
quelle
spinner-service
jetzt Code hinzugefügt, den Sie nur für andere Teile benötigen, damit es funktioniert. Und denken Sie daran, es ist fürangular2-rc-1
Warum nicht einfach einfaches CSS verwenden:
Und in deinen Stilen:
Oder wir können dies für die erste Antwort tun:
Und dann einfach nur
Der Trick dabei ist, dass die neuen Routen und Komponenten immer nach dem Router-Outlet angezeigt werden. Mit einem einfachen CSS-Selektor können wir das Laden ein- und ausblenden.
quelle
Wenn Sie eine spezielle Logik für die erste Route , können Sie Folgendes tun:
AppComponent
Ich musste meine Seitenfußzeile ausblenden, die ansonsten oben auf der Seite angezeigt wurde. Auch wenn Sie nur einen Lader für die erste Seite möchten, können Sie diesen verwenden.
quelle
Sie können auch diese vorhandene Lösung verwenden . Die Demo ist da . Es sieht aus wie eine YouTube-Ladeleiste. Ich habe es gerade gefunden und meinem eigenen Projekt hinzugefügt.
quelle