Service de variables qui ne sont pas mise à jour dans le contrôleur
J'ai un NavbarCtrl qui est en dehors de ng-view. J'ai une connexion contrôleur qui parle à un service pour obtenir un utilisateur connecté. Une fois que l'utilisateur est connecté, je veux que la barre de navigation pour mettre à jour avec l'adresse email de l'utilisateur. Cependant, pour la vie de moi, je n'arrive pas à obtenir la barre de navigation de la portée de la mise à jour avec les données chargées dans mon "Auth" service une fois que l'utilisateur est connecté.
C'est ma principale index.html:
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="#">Brim</a>
<div class="pull-right" ng-controller="NavbarCtrl">
<div ng-click="refresh()">hello</div>
{{ user.email }}
</div>
</div>
</div>
</div>
<div class="container" ng-view>
Et mon service:
.factory('Auth', function($resource) {
var authenticated = false;
var user = {};
return {
isAuthenticated: function () {
return authenticated;
},
getUser: function() {
return user;
},
login: function(loginUser, callback) {
user = {email:'[email protected]'}
authenticated = true;
callback(true);
//actual code for logging in taken out for brevity
}
}
})
Et mon Login et Navbar contrôleurs:
function LoginCtrl($scope, $location, Auth) {
$scope.login = function() {
Auth.login($scope.user, function(success) {
if(success) $location.path('/dashboard');
//console.log(Auth.getUser())
});
}
}
function NavbarCtrl($scope, Auth) {
//thought this should work
$scope.user = Auth.getUser();
//experimenting unsuccessfully with $watch
$scope.$watch(Auth.isAuthenticated(),function () {
$scope.user = Auth.getUser()
})
//clicking on a refresh button is the only way I can get this to work
$scope.refresh = function() {
$scope.user = Auth.getUser()
}
}
De ma recherche, j'aurais pensé que $champ d'application.utilisateur = Auth.getUser(); mais il n'est pas et je suis à une perte complète de la façon dont comment je peux obtenir ma barre de navigation mis à jour lorsqu'un utilisateur est connecté. Merci d'avance pour toute aide.
- Un peu hors-sujet, mais n'auriez-vous pas aussi de perdre la trace de l'utilisateur authentifié sur l'actualisation? Avez-vous éventuellement élargir cette pour utiliser le stockage de session?
- Oui, j'ai fait des expériences avec le stockage de session pour garder une trace de l'utilisateur authentifié. Je suis tombé sur github.com/grevory/angular-local-storage
Vous devez vous connecter pour publier un commentaire.
Mise à jour: eh bien, vous apprenez quelque chose de nouveau chaque jour... il suffit de retirer le
()
de regarder les résultats d'une fonction:Mis à jour le violon
Dans ce violon, remarquez comment 'watch1" et "watch3" à la fois déclencher une deuxième fois lorsque la valeur de
$scope.isAuthenticated
changements.Donc, c'est la technique générale de regarder pour un changement de primitive valeur est définie sur un service:
À surveiller les modifications apportées à un objet ou un tableau qui est définie sur un service:
E. g., ne pas faire ceci:
user = ...;
Plutôt faire ceci:
angular.copy(newInfo, user)
ou ceci:user.email = ...
Exemple:
Réponse originale à cette question:
De regarder les résultats d'une fonction, vous devez passer $regarder une fonction qui encapsule cette fonction:
Violon. En coulisse, remarquez comment seulement "watch3' déclenche une deuxième fois lorsque la valeur de
$scope.isAuthenticated
changements. (Ils déclenchent d'abord, dans le cadre de dollars de regarder l'initialisation.)Essayer de changer
à
Regarder la AungularJs $regarder la documentation pour une explication détaillée, la valeur par défaut est false, ce qui signifie que Angulaires détecte les changements dans la première des valeurs de paramètre par référence, en passant true signifie que la vérification est effectuée par l'égalité. Étant le paramètre d'une fonction, la vérification renvoie toujours faux, puisque la référence à la fonction est toujours la même.
À l'aide de
user
que votre nom de variable est généralement pas une bonne idée. - Je une fois que je l'ai changé ticurrentUser
tout a fonctionné pour moi.