Comment dois-je traiter la page rafraîchissant avec un AngularJS Seule Page de l'Application
Deux problèmes se sont posés à moi comme je l'ai appris angulaire:
-
Comment puis-je restaurer l'état lorsque l'utilisateur actualise la page ou clique sur le bouton précédent?
-
Comment puis-je partager des données entre des étendues appartenant à différents contrôleurs?
Ci-dessous, je montre une solution simple qui rend l'utilisation de session côté client de stockage. Il permet à la fois le partage de données communes et de la restauration automatique de l'état après un utilisateur actualise la page ou clique sur le bouton précédent.
Remarque: La solution ci-dessous s'est avéré indispensable pour répondre à la question suivante:
OriginalL'auteur biofractal | 2014-01-28
Vous devez vous connecter pour publier un commentaire.
La solution dépend de la
SessionService
classe indiquée ci-dessous. La syntaxe est coffeescript.SessionService Classe
La
SessionService
classe définit lesisAuthenticated
propriété (simple bool) et leuser
propriété d'un objet complexe) . Les valeurs de ces propriétés sont automatiquement stringified /analysée comme ils sont stockés /récupérées à l'aide du côté client localsessionStorage
objet fourni par le javascript.Vous ajoutez plus de propriétés, comme l'exige. Comme
$rootScope
vous ajoutez des propriétés de parcimonie. Contrairement à$rootScope
les valeurs de propriété sont encore disponibles après un rafraichissement de la page ou à l'arrière de clic de bouton.Le service permet à n'importe quel nombre de champs à être inscrit. Lorsqu'un champ est enregistré toutes les valeurs stockées dans
sessionStorage
sont automatiquement affectés à cette portée. De cette façon, tous les étendues de toujours avoir accès à toutes les propriétés de session.Lorsque la valeur d'une propriété est mise à jour, tous les étendues ont leurs valeurs correspondantes à jour.
Quand angulaire détruit un champ d'application il est automatiquement supprimé de la liste des inscrits étendues pour enregistrer le gaspillage des ressources.
Si un utilisateur actualise la page ou frappe le dos, puis sur le bouton angulaire de l'application est obligé de redémarrer. Normalement, cela signifierait que vous auriez à reconstruire votre état actuel. Le
SessionService
fait cela pour vous automatiquement que chaque application a ses valeurs restauré à partir de locaux de stockage lorsqu'ils sont enregistrés pendant l'initialisation de l'application.Alors maintenant, il est facile de résoudre le problème de l'échange de données entre les étendues ainsi que la restauration des valeurs lors de l'actualisation de l'utilisateur ou clique sur le bouton précédent.
Voici quelques exemples angulaire de code qui montre comment utiliser la
SessionService
classe.Enregistrer une portée avec SessionService dans certains Contrôleur
Ensemble de valeurs de Session dans un service
Utiliser les valeurs de Session dans l'INTERFACE utilisateur (modèle Jade)
Vous pouvez convertir la coffeescript à javascript et à l'arrière à nouveau ici: js2coffee.org. Il y a certainement d'autres / les meilleures solutions et j'ai d'abord cru qu'il n'y doit être facile, angulaire façon de gérer une telle chose commune à l'arrière/actualiser les boutons. Mais je ne pouvais pas trouver ce que vous voyez ici est mon meilleur, plan en cours à le faire fonctionner. J'espère que quelqu'un poste une meilleure solution.
+1 pour " pourquoi les gens postent des coffeescript solutions angulaire???'
Pouvez-vous expliquer pourquoi les gens devraient pas post coffeescript-syntaxe des solutions angulaire? Depuis coffeescript est une façade pour le javascript sous-jacentes, est le point que nous ne devrions pas utiliser javascript?
Je pense que c'est juste inefficace pour la plupart d'entre nous qui n'utilisent pas cofeescrpt/tapuscrit etc. d'avoir à convertir (et éventuellement d'introduire des erreurs) le code avant que je puisse l'utiliser.
OriginalL'auteur biofractal
J'ai été confrontée au même problème et a décidé d'utiliser angulaire des cookies, depuis le
le seul état qui n'est pas tiré par le modèle via ng-init est l'utilisateur connecté
état.
- Je stocker l'ID de l'utilisateur dans un cookie de connexion après, j'ai reçu de l'utilisateur
modèle à partir de notre serveur et j'ai clairement l'utilisateur ID de cookie lors de la déconnexion. Ensuite, pour récupérer
l'utilisateur connecté de l'état sur un rafraichissement de la page ou le bouton de retour de l'événement, j'accroche le
$location
du service$locationChangeStart
événement. De mon expérimentation, cel'événement est déclenché au point de l'emplacement est sur le point de changer, mais avant le
partielle/modèle a été chargé. Cela permet à l'état nécessaires pour être chargé seulement
dans le temps.
Je ne suis pas convaincu que je n'ai pas une condition de concurrence ici que
$scope.loadLoggedInUser(...)
utilise asynch $http à la charge de l'état nécessaires, mais jusqu'à présentil a travaillé de manière fiable pour moi.
OriginalL'auteur Kenosis
Il existe une solution simple lorsque vous utilisez Node.js pour configurer votre serveur. Vous devez organiser votre routage du côté client dans une manière qui rend votre route des liens uniques avec les expressions régulières. Dans app.js vous aurez:
Dans cet exemple, toutes les routes, à l'exception de
'/'
, peut être écrite dans une expression régulière schéma[A-Za-z]
. Considérant ceci, la server.js le fichier comme ceci:Maintenant, chaque
GET
demande qui correspond à l'expression rationnelle[A-Za-z]
fera une réponse avecindex.html
(qui sont nos itinéraires appelé lors de l'actualisation d'une page par exemple/about
). Toute autreGET
demande de réponse avec un fichier à partir de la/public
répertoire (ici chaque fichier avec l'extension*.html
). Cela permet de rafraîchir la AngularJS SPA d'une manière appropriée.OriginalL'auteur D Wal