Несколько лет писал код на react, но теперь столкнулся с Angular инъекциями.
Делал простую службу аутентификации:
@Injectable({ providedIn: 'root' }) export class AuthenticationService { public currentUserSubject: Subject<User>; public token: string = '';
constructor(private http: HttpClient, private router: Router, private localStorageService: LocalStorageService) { this.currentUserSubject = new Subject<User>(); }
authorization = (token): string => `${TOKEN_TYPE} ${token}`;
setLocalUser = (user: User) => { if (user && user.access_token) { localStorage.setItem(CURRENT_USER, JSON.stringify(user)); this.currentUserSubject.next(user); this.router.navigate(['/']); } else { localStorage.removeItem(CURRENT_USER); this.currentUserSubject.next(null); this.router.navigate(['/login']); } }
getCurrentUser() { return this.http.get<any>(`${environment.apiUrl}/${ROUTES.AUTHENTICATE}`, { headers: { Authorization: this.authorization(this.token), // TODO USE INTERCEPTORS } }) .pipe( map((user): any => { this.setLocalUser(user); return user; }), catchError(err => { this.setLocalUser(null); return of(null); }) ); } }
Все шло хорошо, пока мне не пришлось подписаться на компонент текущего пользователя службы аутентификации:
@Component({ selector: 'app-header', templateUrl: './header.component.html', providers: [AuthenticationService] }) export class HeaderComponent implements OnInit {
user: User; constructor(private authenticationService: AuthenticationService) { }
ngOnInit(): void { this.authenticationService.currentUserSubject.subscribe((user) => { this.user = user; }); }
logout(): void { this.authenticationService.logout(); } }
Я получал обновления на следующий только один раз после обновления страницы, но
this.currentUserSubject.next(user);
в службе currentUserSubject был обновлен, пару часов я искал ответы на stackoverflow и medium, безуспешно, и я позвонил своему другу, который несколько лет работал с Angular, он сказал мне, что с помощью этого
providers: [AuthenticationService]
в декораторе создает новый экземпляр службы, и, очевидно, я пытался получить обновление из другого экземпляра службы. Итак, я просто удалил эту строку, и все начинает работать отлично.