2016-10-24 3 views
2

Ich versuche eine Navigationsleiste zu implementieren, die verschiedene Links basierend darauf anzeigt, ob ein Benutzer angemeldet ist oder nicht.Aufrufen der Komponentenaktualisierung in Angular 2

Ich verwende die angular2-jwt-Bibliothek, die die tokenNotExpired()-Funktion bereitstellt.

Ich habe 2 Routen, /home und /login. Ich habe eine Navbar-Komponente, die außerhalb der <router-outlet> ist, was bedeutet, dass es nur einmal initialisiert wird und nicht jedes Mal, wenn sich die Route ändert.

Nach erfolgreicher Anmeldung rufe ich router.navigate(['/home]) auf. Sowohl das Home als auch das Login überprüfen, ob ein Benutzer in seinen jeweiligen ngOnInit() Funktionen angemeldet ist. Die Home-Komponente kann somit den angemeldeten Benutzer erkennen.

Allerdings kann ich die Navbar nicht aktualisieren, da sie nicht über die Anmeldung informiert ist.

Könnte mir bitte jemand den richtigen Weg erklären, diese Änderungserkennung zu implementieren?

Danke.

Antwort

4

Expose Login-Status über Service

@Injectable() 
export class UserAuthService{ 
    userLoggedIn : bool = false; 

    //call this function when login status changes 
    changeLoginStatus(status: bool){ 
     this.userLoggedIn = status; 
    } 
} 

machen Sie da Singletons

@NgModule({ 
    declarations: [ 
    NavbarComponent, 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule, 
    routing, 
    ], 
    providers: [UserAuthService], // <-- Provide your service here 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

Benutzer Ihren Dienst in Ihrem navbar

import { UserAuthService } from 'path/to/service'; 

export class NavbarComponent { 
    constructor(private authService: UserAuthService) { } // <-- inject service 

    ngOnInit() { } 
} 

so können Sie Ihre Template-Dienst ändern.

<div [hidden]="!authService.userLoggedIn"><a routerLink="/login">login</a></div> 

Aufruf changeLoginStatus Funktion des Dienstes, wenn Änderungen Login-Status.

+0

Danke Sefa. Da ich die 'angular2-jwt' Bibliothek verwende, habe ich' userLoggedIn: bool = false; 'und die change Funktion durch eine Funktion ersetzt, die die Ausgabe von' tokenNotExpired() 'zurückgibt. –

+0

Das funktioniert. Sie greifen jedoch direkt von der View aus auf die Servicevariable zu: '[hidden] ="! AuthService.userLoggedIn "'. Ist das wirklich der richtige Weg (denke ich nicht)? Sollten wir BehaviorSubject nicht verwenden und die Änderungen propagieren und über Navbar abonnieren? – Devner