Je suis un débutant pour angularjs.
Mon problème est que j'ai un contrôleur utilisateur pour gérer la connexion et la déconnexion. J'ai également un autre contrôleur pour charger un menu d'en-tête pour mon site.
Si l'utilisateur se connecte au site, ma variable isAuthenticated est définie sur true. Si la variable est définie sur true, l'en-tête doit être modifié, mais je pense donc que le contrôleur doit être rechargé pour changer la vue de l'en-tête.
Voici le code de mon HeaderController:
myapp.controller('HeaderController', ['$scope', '$location', '$window', 'AuthenticationService',
function HeaderController($scope, $location, $window, AuthenticationService) {
$scope.isAuthenticated = AuthenticationService.isAuthenticated;
if (AuthenticationService.isAuthenticated) {
$scope.user.vorname = $window.sessionStorage.user.vorname;
}
}
]);
Voici le code de mon HeaderDirective:
myapp.directive('appHeader', function() {
return {
restrict: 'E',
link: function(scope, element, attrs) {
if (attrs.isauthenticated == 'false') {
scope.headerUrl = 'views/header/index.html';
} else {
scope.headerUrl = 'views/header/isAuthenticated.html';
}
},
template: '<div ng-include="headerUrl"></div>'
}
});
Mon index.html:
<div ng-controller="HeaderController">
<app-header isauthenticated="{{isAuthenticated}}"></app-header>
</div>
Comment puis-je recharger le contrôleur si l'utilisateur se connecte à la page?
PS: Veuillez excuser ma mauvaise prononciation.
Il n'est pas nécessaire de recharger votre contrôleur. Angular est assez intelligent pour changer le modèle lorsque le $scope.isAuthenticated
changements d'état.
Un problème que je vois dans votre code est qu'une fois le $scope.isAuthenticated
est défini, il ne change plus. Je suppose que vous définissez AuthenticationService.isAuthenticated = true
lorsque l'utilisateur se connecte mais que cette modification n'est pas propagée au $scope.isAuthenticated
propriété car en JavaScript les valeurs scalaires sont copiées par valeur plutôt que par référence.
Il existe de nombreuses approches, telles que la modification du AuthenticationService.isAuthenticated
propriété d'un booléen à une fonction:
angular.module('auth', [])
.factory('AuthenticationService', function () {
// private state
var isAuthenticated = false;
// getter and setter
var auth = function (state) {
if (typeof state !== 'undefined') { isAuthenticated = state; }
return isAuthenticated;
};
// expose getter-setter
return { isAuthenticated: auth };
});
Attribuez ensuite cette fonction à la portée $:
$scope.isAuthenticated = AuthenticationService.isAuthenticated;
Utilisez ensuite la fonction dans votre modèle (n'oubliez pas les parens)
<app-header isauthenticated="{{ isAuthenticated() }}"></app-header>
Modifier:
En écrivant un plunk pour vous montrer un exemple de travail, j'ai réalisé que la fonction de lien de la directive n'est pas appelée plus d'une fois , donc comme exposé dans - ce thread stackoverflow Je viens de modifier la directive pour observer les changements dans l'attribut isauthenticated
:
angular.module('directives', [])
.directive('appHeader', function() {
var bool = {
'true': true,
'false': false
};
return {
restrict: 'E',
link: function (scope, element, attrs) {
attrs.$observe('isauthenticated', function (newValue, oldValue) {
if (bool[newValue]) { scope.headerUrl = 'authenticated.html'; }
else { scope.headerUrl = 'not-authenticated.html'; }
});
},
template: '<div ng-include="headerUrl"></div>'
}
});
Ajoutez ce morceau de code après que l'utilisateur est authentifié:
// To refresh the page
$timeout(function () {
// 0 ms delay to reload the page.
$route.reload();
}, 0);
N'oubliez pas d'inclure $timeout
et $route
dans votre manette.
myapp.controller('HeaderController', ['$scope', '$location', '$window', 'AuthenticationService', '$timeout', '$route',
function HeaderController($scope, $location, $window, AuthenticationService, $timeout, $route)