Изменение угловой навигационной панели при входе в систему

#angular #authentication #rxjs-observables #angular-observable

Вопрос:

У меня есть панель навигации в компоненте приложения:

app.component.html

 <div class="collapse navbar-collapse" id="navbarSupportedContent">
  <ul class="navbar-nav me-auto mb-2 mb-lg-0">
    <li class="nav-item">          
      <div *ngIf="_loginService.user.name.length > 0 amp;amp; _loginService.user.id.length > 0 ; else elseBlock">
        <a class="nav-link" (click)="logout()">Logout {{ _loginService.user.name }}</a> 
      </div>
      <ng-template #elseBlock>
        <a class="nav-link" routerLink="login">Login</a>            
      </ng-template>                                          
  </ul>
</div>
 

приложение.компонент.ts

 export class AppComponent implements OnInit {
  user: User = {
    name: '',
    id: ''
  };
  
  constructor(public _loginService: LoginService){
  }

  ngOnInit(): void {    
  }

  getUser(): User{
    return this._loginService.user;
  }

  logout(){
    this._loginService.logout()    
  }    

}
 

Когда пользователь входит в систему, на панели навигации должно отображаться «имя пользователя для выхода».
Для этого я успешно внедрил службу входа в систему:

 @Injectable()
export class LoginService{

    user: User = {
      name:'',
      id:''
    };

    userChange: Subject<User> = new Subject<User>();

    constructor(){
      this.userChange.subscribe(value =>{
        console.log("userChange.subscribe",value)
        this.user = value
      })
    }
  
    login(name = "",id = ""){      
      this.userChange.next({name: name, id: id})
    }
  
    logout(){
      this.userChange.next({name:'',id:''})
    }      
   
}
 

Но, как вы можете видеть, я предоставляю свой сервис входа в систему как общедоступный в своем компоненте приложения.

 <div *ngIf="_loginService.user.name.length > 0 amp;amp; _loginService.user.id.length > 0 ; else elseBlock">
 

Я попытался сделать:

   getUser(): User{
    return this._loginService.user;
  }
 

а затем используйте getUser в app.component.html:

 <div *ngIf="getUser.name.length > 0 amp;amp; getUser.id.length > 0 ; else elseBlock">
 

но это не работает. Пожалуйста, помогите!

Ответ №1:

Это не работает, потому getUser что это функция, вам нужно вызвать ее как :

 <div *ngIf="getUser().name.length > 0 amp;amp; getUser().id.length > 0 ; else elseBlock">
 

Или используйте геттер, например

 get userInfo(): User{
  return this._loginService.user;
}
 

и

 <div *ngIf="userInfo.name.length > 0 amp;amp; userInfo.id.length > 0 ; else elseBlock">