92 votes

Comment stocker un contexte utilisateur actuel dans AngularJS ?

J'ai un AuthService, qui se connecte à un utilisateur, il renvoie un objet json utilisateur. Ce que je veux faire, c'est définir cet objet et faire en sorte que tous les changements soient reflétés dans l'application (état de connexion et de déconnexion) sans avoir à rafraîchir la page.

Comment pourrais-je accomplir cela avec AngularJS ?

180voto

Josh David Miller Points 66508

Le moyen le plus simple d'y parvenir est d'utiliser un service. Par exemple :

app.factory( 'AuthService', function() {
  var currentUser;

  return {
    login: function() { ... },
    logout: function() { ... },
    isLoggedIn: function() { ... },
    currentUser: function() { return currentUser; }
    ...
  };
});

Vous pouvez ensuite y faire référence dans n'importe lequel de vos contrôleurs. Le code suivant surveille les changements dans une valeur du service (en appelant la fonction spécifiée) et synchronise ensuite les valeurs modifiées avec la portée.

app.controller( 'MainCtrl', function( $scope, AuthService ) {
  $scope.$watch( AuthService.isLoggedIn, function ( isLoggedIn ) {
    $scope.isLoggedIn = isLoggedIn;
    $scope.currentUser = AuthService.currentUser();
  });
});

Ensuite, bien sûr, vous pouvez utiliser ces informations comme bon vous semble, par exemple dans des directives, des modèles, etc. Vous pouvez répéter cela (en fonction de vos besoins) dans vos contrôleurs de menu, etc. Tout cela sera mis à jour automatiquement lorsque vous modifierez l'état du service.

Tout ce qui est plus spécifique dépend de votre mise en œuvre.

J'espère que cela vous aidera !

1 votes

C'est ce que je pensais aussi, mais je suis curieux de savoir comment fonctionne l'usine. N'aurons-nous pas un contexte currentUser différent à chaque fois qu'un contrôleur sera créé et demandera un AuthService ? Peut-être que je ne comprends pas bien comment Angular accroche les choses. L'idéal serait d'avoir un seul contexte. Comme alternative, je pensais utiliser le magasin ngCookies (pas mon idée préférée) ou le stockage du navigateur (pas encore très bien supporté).

28 votes

@ChrisNicola En fait, dans AngularJS, tous les services sont des singletons. Le service est donc créé la toute première fois qu'il est demandé (par un contrôleur ou un autre service) et toutes les demandes suivantes renvoient exactement la même instance.

0 votes

@JoshDavidMiller Vous avez le isLoggedIn comme une fonction ? Ne serait-ce pas un booléen ?

5voto

Javarome Points 490

Je modifierais la bonne réponse de Josh en ajoutant que, comme un AuthService intéresse généralement tout le monde (disons, tout le monde mais la vue de connexion devrait disparaître si personne n'est connecté), peut-être qu'une alternative plus simple serait de notifier les parties intéressées en utilisant $rootScope.$broadcast('loginStatusChanged', isLoggedIn); (1) (2), tandis que les parties intéressées (telles que les contrôleurs) écouteraient en utilisant les éléments suivants $scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; } .

(1) $rootScope étant injecté comme argument du service

(2) Notez que, dans le cas probable d'une opération de connexion asynchrone, vous voudrez notifier à Angular que la diffusion changera les choses, en l'incluant dans un fichier de type $rootScope.$apply() fonction.

En ce qui concerne la conservation du contexte utilisateur dans plusieurs contrôleurs, il se peut que vous ne soyez pas heureux d'écouter les changements de login dans chacun d'entre eux, et que vous préfériez n'écouter que le contrôleur de login le plus haut, puis ajouter d'autres contrôleurs conscients du login en tant que contrôleurs enfants/embedded de celui-ci. De cette façon, le contrôleur enfant sera capable de voir les propriétés $scope héritées du parent, comme votre contexte utilisateur.

4 votes

Descendu pour explication incorrecte de la fonction de l'usine. Ce malentendu a déjà été abordé dans ce commentaire des mois avant que vous ne postiez votre réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X