Persistance et accès aux valeurs globalement dans plusieurs composants dans Angular 2
J'ai une page de paramètres, les utilisateurs peuvent enregistrer certaines variables de configuration, comme un nom d'utilisateur. L'utilisateur peut également modifier le nom d'utilisateur sur la page. Mais quand je vais à un autre Composant (page) et à l'arrière, le nom d'utilisateur n'est pas enregistré.
Je veux aussi montrer le nom de l'utilisateur dans les autres composantes. Comment dois-je faire? Avec une variable globale?
Structure:
- App
- app.ts (principal)
- réglage.ts
- someOtherComponent.ts
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez besoin est un service destiné à maintenir l'état de vos variables. Vous serez alors en mesure d'injecter ce service à tout composant de définir ou obtenir cette variable.
Voici un exemple (/services/ma.service.ts):
Vous auriez probablement eu envie de mettre que le service dans les fournisseurs de tableau de votre application bootstrap fonction (qui peut être dans votre application principale composante de fichier, ou dans un fichier séparé en fonction de comment vous aimez faire les choses).
Dans votre application principale de fichier (/app.ts):
Vous n'avez pas besoin d'avoir COMMON_DIRECTIVES et de l'autre tous les bouchons des éléments dans le tableau, mais ceux-ci sont généralement inclus juste pour faire de sorte que vous n'avez pas à configurer chaque composant que vous écrivez.
Ensuite, vous accédez au service depuis l'intérieur d'un composant qui ressemble à ceci (/composants/quelques-composant.ts):
Vous pouvez également ajouter le service de sorte qu'il a sauvé de la valeur à quelque part (semi) permanent afin qu'il puisse être consulté la prochaine fois que l'utilisateur a entré l'application.
Cela peut-être trop dans votre situation actuelle, mais si vous allez développer votre application dans un plus grand, cela peut vous faire gagner beaucoup de problèmes sur toute la ligne. Ceci dit, je crois Angulaire avec Redux-comme le magasin est vraiment une combinaison puissante. Ma suggestion est d'utiliser
ngrx/store
module.Source:
ngrx/store
dépôt GitHubLe code ci-dessous doit décrire toutes les étapes que vous devez suivre pour intégrer la
ngrx/store
dans votre application. Par souci de concision, j'ai omis de code existant que vous pourriez avoir et toutes les importations dont vous aurez besoin pour ajouter.Installer le Module
Créer un Réducteur de
Importer les StoreModule
Créer l'Interface pour les Paramètres de Réducteur de
Créer une Interface de banque
De Créer Des Paramètres De Service
Paramètres Composant Contrôleur
Paramètres Du Modèle De Composant
Avec la configuration décrite ci-dessus, vous pouvez ensuite injecter le
SettingsService
à tout composant et l'affichage de la valeur dans son modèle.De la même façon, vous pouvez également mettre à jour la valeur de la
store
partir de n'importe quel composant à l'aide dethis.settingsService.update({ ... });
et le changement pourra être répercuté sur tous les lieux qui sont à l'aide de cette valeur - être un composant via unasync
tuyau ou d'un autre service via.subscribe()
.Vous auriez besoin d'un service de ce que vous pouvez injecter dans les partout où vous en avez besoin.:
Vous pouvez fournir ce service dans tous vos modules, mais il y a une chance, vous obtiendrez plusieurs instances. Donc, nous allons faire le service d'un singleton.
Vous devriez appeler le
forRoot
méthode que dans votreAppModule
:Vladimir correctement mentionné au sujet de
ngrx
.Je voudrais utiliser un service avec
Subject
/BehaviourSubject
etObservable
àset
etget
l'état (valeurs) que j'ai besoin.Nous avons discuté ici La Communication entre plusieurs composants avec un service à l'aide Observables et sous réserve Angulaire 2 comment vous pouvez partager des valeurs de plusieurs composants qui n'ont pas de
parent
-child
ouchild
-parent
relation et sans de l'importation d'une bibliothèque externe commengrx
magasin.J'ai le même problème, la plupart des besoins en composants loggedInUser de l'information.
Pour exemple : nom d'utilisateur, la langue préférée, préféré le fuseau horaire de l'utilisateur, etc.
Donc, pour cela, une fois que l'utilisateur se connecte, on peut effectuer les opérations suivantes :
Si toutes les informations sont dans JWT Jeton ou /moi Api RESTful, alors vous pouvez décoder le jeton dans l'une des service.
par exemple: l'utilisateur.service.ts
qui détient trois publics Comportement de l'objet, celui qui est à l'écoute de cette variable, obtenez la valeur si c'est le changement. Veuillez vérifier les rxjs style de programmation.
et maintenant, partout où cette variable sont nécessaires, il suffit de s'abonner à partir de ce composant.
Pour exemple: NavComponent sera définitivement besoin d'un nom d'utilisateur. d'où le code comme ci-dessous:
Donc, réactif de programmation donne la meilleure solution pour faire face à la dépendance de la variable.
Ci-dessus résout également le problème si la page est dur d'actualisation, comme je suis de stocker la valeur dans le localstorage et de récupération dans le constructeur.
Veuillez noter : Il est supposé que l'utilisateur connecté données proviennent de JWT jeton, nous pouvons également le même service(UserHttpService) si les données proviennent de Api Restful. Par exemple: api/me