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éthode isAuthenticated() ?
  • 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 dans Login 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...

InformationsquelleAutor Daanv z | 2017-11-24