NgIf pas mise à jour lors de la modification de la variable
Droit, j'ai donc un composant d'en-tête (navbar) qui contient le modèle suivant:
<ng-template [ngIf] = "authService.isAuthenticated()">
<li>
<a routerLink="Landing" class="navbar-brand" (click)="Logout()"><span class="xvrfont">Logout</span><i class="fa fa-sign-in" aria-hidden="true"></i></a>
</li>
<li>
<a routerLink="Profile" class="navbar-brand"><span class="xvrfont">{{authService.getUsername()}}</span><i class="fa fa-user-circle" aria-hidden="true"></i></a>
</li>
</ng-template>
Cette partie de la valeur liquidative doit être visible lorsque l'utilisateur est authentifié. pour le savoir, il vérifie via authService.
Pour vérifier si un utilisateur est authentifié, le code suivant est exécuté à chaque changement d'itinéraire:
checkAuthenticated(){
if (localStorage.getItem('token') != null){ this.authenticated = true; }
else { this.authenticated = false; }
console.log(this.authenticated); //for Debugging.
}
La NgIf déclaration appelle cette méthode:
public isAuthenticated(){
return this.authenticated;
}
Selon les journaux, 'authenticated' est de changement entre le vrai et le faux correctement, mais le Ngif n'est pas de répondre aux changements en quelque sorte.
le composant d'en-tête.ts ressemble à ceci:
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import {AuthService} from "../auth/auth.service";
@Component({
selector: 'app-header',
providers: [AuthService],
templateUrl: './header.component.html',
styleUrls: ['./header.component.css'],
encapsulation: ViewEncapsulation.None
})
export class HeaderComponent implements OnInit {
constructor(private authService: AuthService) { }
ngOnInit() {
}
Logout(){
this.authService.Logout();
}
}
Toute aide serait appréciée. Merci.
Edit:
auth.service.ts:
import { Injectable } from '@angular/core';
import {HttpClient, HttpHeaders} from '@angular/common/http';
import {Router} from "@angular/router";
import 'rxjs/add/operator/map';
@Injectable()
export class AuthService {
public apiroot = 'http://localhost:3100/';
public loginResponseMessage = '';
public registerResponseMessage = '';
public authenticated = false;
public constructor(private http: HttpClient,
private router: Router) {
}
SignUp(username: string, password: string) {
const User = JSON.stringify({username: username, password: password});
let response: any;
this.http.post(this.apiroot + 'register', User, {headers: new HttpHeaders()
.set('content-type', 'application/json; charset=utf-8')})
.subscribe(res => {
response = res;
this.registerResponseMessage = response.message;
console.log(this.registerResponseMessage);
});
}
Login(username: string, password: string) {
const User = JSON.stringify({username: username, password: password});
let response: any;
this.http.post(this.apiroot + 'authenticate', User, {headers: new HttpHeaders()
.set('content-type', 'application/json; charset=utf-8')})
.subscribe(res => {
response = res;
this.loginResponseMessage = response.message;
if (response.token) {
localStorage.setItem('token', response.token);
this.authenticated = true;
localStorage.setItem('user', response.username);
this.router.navigate(['/']);
}
else{ /* Do Nothing */ }
});
}
Logout(): void{
this.authenticated = false;
localStorage.removeItem('token');
console.log(this.isAuthenticated());
this.router.navigate(['/Landing']);
}
isAuthenticated(){
return this.authenticated;
}
checkAuthenticated(){
if (localStorage.getItem('token') != null){ this.authenticated = true; }
else { this.authenticated = false; }
console.log(this.authenticated); //for Debugging.
}
getUsername(){
var result = localStorage.getItem('user');
return result;
}
}
- il devrait être
*ngIf
- pouvez-vous poster le
AuthService
classe ? Quel est le type de retour de la méthodeisAuthenticated()
? isAuthenticated()
retourne un booléen. j'ai ajouté le AuthService à la poste.- oui mais c'est la valeur par défaut est false, et il est mis à jour de manière asynchrone en vous abonnant à un Observables retourné à partir de
this.http.post
dansLogin
méthode. - pouvez-vous essayer avec ma réponse?
- "authService.isAuthenticated()" de ne pas avoir authService référence changé chaque fois que authService.authentifié changements. Si la détection de changement ne se produira pas. Aussi, l'appel à une méthode d'une instance dans votre *ngIf est une mauvaise pratique. Ont une fonction de l'appel de la authservice à l'intérieur de votre composant. Je vous suggère de commencer à utiliser des observables que...
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous êtes de fournir le service au niveau du composant, ce qui signifie que tous vos composants, qui ont le service ajouté à
providers
tableau en composant leur propre instance de service, de sorte que ce n'est pas un service commun à tous. Vous souhaitez avoir un singleton de service, de sorte seulement régler le service dans votreproviders
tableau dans votrengModule.
Également comme mentionné par d'autres, appelant les méthodes de modèle est une très mauvaise idée, cette méthode est appelée à chaque changement de détection, qui est souvent, donc ça fait vraiment mal les performances de l'application.
Vous pouvez utiliser des Observables comme suggéré, ou alors juste une variable partagée dans votre service. Dans le long terme, je vous conseille d'Observables, mais selon les cas, une variable partagée est bien. Voici un échantillon pour les deux: Le passage des données en "routeur-prise" enfant composants (angulaire 2)
Une bonne façon est de partager des données à travers réactif de codage avec Observables.
À votre service, créer un BehaviorSubject et ses Observables:
Chaque fois que vous souhaitez mettre à jour votre valeur, faire une
next
sur votre sujet:Côté composant, il suffit de s'abonner observables pour définir la valeur localement pour chaque sous réserve de modifications:
Ou de la valeur d'affichage dans votre modèle avec async pipe:
modèle doit être