@Vadimqa

Angular2: как при авторизации обновить header.component?

Как подписаться на обновление хеадера при авторизации? В инете миллион вопросов по этому поводу, но слишком частные случаи и ответы для моего понимания. Я слабоват.
Есть user.service
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class UserService {
  
    constructor(private http: HttpClient) { }
     
    getUser() {
        return this.http.get('/server/api/userService');
    }

    public isAuthenticated(): Observable<boolean> {   
      return this.getUser().pipe(
          map(data => !!data['login'])
      );
    }

}


И header.component
import { Component, OnInit } from '@angular/core';
import { UserService } from '../../shared/user.service';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.css'],
  providers: [UserService]
})

export class HeaderComponent implements OnInit {

      user: any;
      auth: boolean = false;

      isAuthenticated: boolean;
      
      constructor(private userService: UserService) { }        

      ngOnInit() {

        this.userService.getUser().subscribe(data => {
          this.user = data;
          if(this.user.login !== false) {this.auth = true;}
        });
      
      
        this.userService.isAuthenticated().subscribe( value => {
          this.isAuthenticated = value;
        });
    
    }

}


Дело в том, что шаблон хеадера никак не реагирует, пока не перезагрузить приложение целиком, нужна какая-то подписка на изменение данных, но я в этом ничего не понимаю
  • Вопрос задан
  • 139 просмотров
Пригласить эксперта
Ответы на вопрос 1
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
@Injectable()
export class UserService {
    isAuthenticated$ = new ReplaySubject(1);
  
    constructor(private http: HttpClient) { }
     
    getUser() {
        return this.http.get('/server/api/userService').pipe(
          tap(data => this.isAuthenticated$.next(!!data['login'])),
        );
    }
}


export class HeaderComponent implements OnInit {
      user$: Observable<User>;
      isAuthenticated$: Observable<boolean>;

     constructor(private userService: UserService) { }        

      ngOnInit() {
        this.user$ = this.userService.getUser();
        this.isAuthenticated$ = this.userService.isAuthenticated$;
     }
}


При использовании AsyncPipe достаточно этого, хотя даже isAuthenticated - лишний.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы