问题
I am trying to implement a navbar that shows different links based on whether or not a user is logged-in.
I am using the angular2-jwt
library which provides the tokenNotExpired()
function.
I have 2 routes, /home
and /login
. I have a navbar component which is outside of the <router-outlet>
, which means it is initialized only once and not every time the route changes.
After successful login, I am invoking router.navigate(['/home])
. The home and login both have checks for if a user is logged-in in their respective ngOnInit()
functions. The home component is therefore able to detect the logged-in user.
However, I am unable to update the navbar since it is not informed of the login.
Could anyone please tell me the correct way to implement this change detection?
Thanks.
回答1:
Expose login status via service
@Injectable()
export class UserAuthService{
userLoggedIn : bool = false;
//call this function when login status changes
changeLoginStatus(status: bool){
this.userLoggedIn = status;
}
}
make your service singleton
@NgModule({
declarations: [
NavbarComponent,
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
routing,
],
providers: [UserAuthService], // <-- Provide your service here
bootstrap: [AppComponent]
})
export class AppModule { }
user your service in your navbar
import { UserAuthService } from 'path/to/service';
export class NavbarComponent {
constructor(private authService: UserAuthService ) { } // <-- inject service
ngOnInit() { }
}
so you can change your template using service.
<div [hidden]="!authService.userLoggedIn"><a routerLink="/login">login</a></div>
call changeLoginStatus
function of the service when login status changes.
来源:https://stackoverflow.com/questions/40213694/invoke-component-refresh-in-angular-2