typescript - Helpoin tapa päivittää Angular 4 -sivu kirjautumisen jälkeen
Minulla on yksinkertainen Angular 4 -projekti, joka näyttää tältä:
app.component.html
<alert></alert> <-- Alert service
<cat-header></cat-header> <-- Site header with Sign in button
<router-outlet></router-outlet> <-- Main content
<cat-footer></cat-footer> <-- Site footer
Kun Kirjaudu sisään -painiketta painetaan, se siirtyy Kirjautumis-komponenttiin (eri sivu). Se käyttää valtuutuspalvelua tarkistaakseen käyttäjän tietokannasta, ja jos hänet löydetään, tallentaa hänet.
localStorage.setItem('currentUser', JSON.stringify(user));
Onnistuneen kirjautumisen jälkeen kirjautumiskomponentti siirtyy pääsivulle
this.router.navigate([this.returnUrl]);
Ongelma on, että navigoinnin jälkeen Header-komponenttia ei päivitetä (esimerkiksi ei Konstruktorin eikä ngOnInit-koodia kutsuta). Kun painan selaimessani Ctrl+F5 alkuperäisen navigoinnin jälkeen, Header-komponentti päivittyy kuten sen pitäisi.
Olen yrittänyt etsiä tätä tapausta Internetistä ja löytänyt joitain monimutkaisia ratkaisuja, kuten Emittereiden tai Dummy-polkujen käyttö sivun uudelleenlatauksen kanssa. Mutta se näyttää hyvin monimutkaiselta ratkaista niin yksinkertainen tehtävä.
Tässä on otsikkokomponenttini:
export class HeaderComponent implements OnInit {
currentUser: User;
constructor(private activatedRoute: ActivatedRoute, private userService: UserService) {
this.activatedRoute.params.subscribe(data => {
this.currentUser = JSON.parse(localStorage.getItem('currentUser'));
});
}
ngOnInit() {
}
}
Ja tässä on koodi Header-komponentin mallissa, jossa on Kirjaudu sisään -painike:
<a *ngIf="currentUser; else notLogedIn" href="javascript: void(0);" [routerLink]="['/login']">Log off</a>
<ng-template #notLogedIn><a href="javascript: void(0);" [routerLink]="['/login']">Log in</a>
Joten tällä hetkellä se näyttää vain erilaista linkkitekstiä.
Tämän logiikan visualisointi:
- Pääsivu onnistuneen kirjautumisen jälkeen, käyttäjä on kirjautunut sisään
- Etusivu manuaalisen päivityksen jälkeen Ctrl + F5 -näppäinyhdistelmällä tai logoa klikkaamalla
Vastaus #1
Olen kokeillut erilaisia lähestymistapoja ja tehnyt helpoimman ratkaisun oman näkökulmani mukaan.
Olen luonut palvelun nykyisen käyttäjän tilan tarkistamista varten:
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class CurrentUserService {
itemValue = new Subject<string>();
set currentUser(user) {
this.itemValue.next(user);
localStorage.setItem('currentUser', user);
}
get currentUser() {
return localStorage.getItem('currentUser');
}
}
ja tilannut tämän palvelun otsikkokomponentistani:
currentUser: User;
constructor(private currentUserService: CurrentUserService) {
currentUserService.itemValue.subscribe(currentUser => {
this.currentUser = JSON.parse(currentUser);
});
}
Se toimii kuin unelma!
Vastaus #2
Tee palvelu tietääksesi, onko käyttäjä kirjautunut sisään vai ei
<cat-header *ngIf="userService.isLoggedIn()"></cat-header>
isLoggedIn(){
return true/ false ;
}
