Wie gehe ich mit der Seitenaktualisierung mit einer AngularJS-Einzelseitenanwendung um?

8

Zwei Probleme haben mich beunruhigt, da ich eckig gelernt habe:

  1. Wie stelle ich den Status wieder her, wenn der Benutzer die Seite aktualisiert oder die Zurück-Taste drückt?

  2. Wie teile ich Daten zwischen Bereichen, die zu verschiedenen Controllern gehören?

Im Folgenden zeige ich eine einfache Lösung, die den clientseitigen Sitzungsspeicher nutzt. Es ermöglicht die gemeinsame Nutzung gemeinsamer Daten und die automatische Wiederherstellung des Status, nachdem ein Benutzer die Seite aktualisiert oder die Zurück-Schaltfläche gedrückt hat.

Hinweis: Die folgende Lösung erwies sich als unerlässlich, um die folgende Frage zu beantworten:

Wie bekomme ich die Zurück-Taste, um mit einem AngularJS-Router zu arbeiten?

    
biofractal 28.01.2014, 13:56
quelle

3 Antworten

5

Die Lösung hängt von der unten angegebenen Klasse SessionService ab. Die Syntax ist Kaffeescript.

SessionService-Klasse

%Vor%

Die Klasse SessionService definiert die Eigenschaft isAuthenticated (simple bool) und die Eigenschaft user (ein komplexes Objekt). Die Werte dieser Eigenschaften werden automatisch mit dem crois-seitigen lokalen Objekt sessionStorage , das von javascript bereitgestellt wird, angegeben / gelesen.

Sie fügen weitere Eigenschaften nach Bedarf hinzu . Wie $rootScope fügen Sie Eigenschaften sparsam hinzu. Im Gegensatz zu $rootScope sind die Eigenschaftswerte auch nach einer Seitenaktualisierung oder einem Zurück-Klick verfügbar.

Der Dienst ermöglicht die Registrierung einer beliebigen Anzahl von Bereichen. Wenn ein Bereich registriert wird, werden alle gespeicherten Werte in sessionStorage automatisch diesem Bereich zugewiesen. Auf diese Weise haben alle registrierten Bereiche immer Zugriff auf alle Sitzungseigenschaften.

Wenn ein Eigenschaftswert aktualisiert wird, werden für alle registrierten Bereiche die entsprechenden Werte aktualisiert.

Wenn eckig einen Bereich zerstört, wird er automatisch aus der Liste der registrierten Bereiche entfernt, um Ressourcen zu sparen.

Wenn ein Benutzer die Seite aktualisiert oder die Zurück-Taste drückt, wird die Winkelanwendung gezwungen, neu zu starten. Normalerweise würde das bedeuten, dass Sie Ihren aktuellen Zustand rekonstruieren müssten. Das SessionService erledigt dies automatisch für Sie, da für jeden Bereich die Werte aus dem lokalen Speicher wiederhergestellt werden, wenn sie während der App-Initialisierung registriert werden.

Nun ist es also leicht, das Problem zu lösen, Daten sowohl zwischen Bereichen zu teilen als auch Werte wiederherzustellen, wenn der Benutzer die Schaltfläche "Zurück" aktualisiert oder drückt.

Hier ist ein Beispielcode, der zeigt, wie die Klasse SessionService verwendet wird.

Registrieren Sie einen Bereich mit SessionService in einem Controller

%Vor%

Festlegen von Sitzungswerten in einem Service

%Vor%

Verwenden Sie Sitzungswerte in der Benutzeroberfläche (Jade-Vorlage)

%Vor%     
biofractal 28.01.2014, 13:56
quelle
0

Ich war mit dem gleichen Problem konfrontiert und entschied mich für eckige Cookies, da die Nur der Status, der nicht von der Vorlage über ng-init gezogen wird, ist der angemeldete Benutzer Zustand.

Ich speichere die Benutzer-ID bei der Anmeldung in einem Cookie, nachdem ich den Benutzer erhalten habe Modell von unserem Server und ich lösche den User-ID-Cookie beim Abmelden. Dann um sich zu erholen der eingeloggte Benutzerstatus bei einem Seitenaktualisierungs - oder Zurücktastenereignis, hake ich den $location service $locationChangeStart event. Aus meinen Experimenten Das Ereignis wird an dem Punkt ausgelöst, an dem sich der Standort ändert, aber vor dem Ereignis Partial / Template wurde geladen. Dadurch kann der benötigte Status nur geladen werden rechtzeitig.

Ich bin nicht überzeugt, dass ich hier keine Race Condition habe $scope.loadLoggedInUser(...) verwendet asynch $ http um den benötigten Zustand zu laden, aber bisher es hat zuverlässig für mich gearbeitet.

%Vor%     
Kenosis 27.07.2015 22:50
quelle
0

Es gibt eine einfache Lösung, wenn Sie Node.js verwenden, um Ihren Server zu konfigurieren. Sie müssen Ihr Routing auf der Client-Seite so organisieren, dass Ihre Route als eindeutige reguläre Ausdrücke verknüpft wird. In app.js hast du:

%Vor%

In diesem Beispiel können alle Routen, außer '/' , in einem regulären Ausdrucksschema [A-Za-z] geschrieben werden. Damit wäre die Datei server.js wie folgt:

%Vor%

Nun wird jede GET -Anfrage, die mit der Regex [A-Za-z] übereinstimmt, eine Antwort mit index.html geben (das sind unsere Routen, die beim Aktualisieren einer Seite aufgerufen werden, z. B. /about ). Jede andere GET -Anforderung antwortet mit einer Datei aus dem /public -Verzeichnis (hier jede Datei mit der Erweiterung *.html ). Dies ermöglicht eine korrekte Aktualisierung des AngularJS SPA.

    
D Wal 07.04.2018 13:38
quelle

Tags und Links