Angular 8: не могу правильно получить значение от сервиса - PullRequest
0 голосов
/ 24 января 2020

У меня есть простой сервис аутентификации только для тестирования, так как я учусь Angular, который устанавливает значение localStorage

GeneralService:

isAuthenticated = new Subject();
autoLogin = new Subject();

AuthenticationService:

if (response.message === 'Logged in') {
    localStorage.setItem('isLoggedIn', '1');
    this.generalS.isAuthenticated.next(true);
  } else {
    this.generalS.isAuthenticated.next(false);
  }

компонент аутентификации

isAuthSub: Subscription;
// in the submit function ...
this.authS.login(userData);
this.isAuthSub = this.generalS.isAuthenticated.subscribe( (data) => {
  if (data) {
    console.log('Yes');
    this.route.navigate(['recipes']);
  } else {
    console.log('No');
  }
});

В консоли я получаю Yes

В компоненте приложения

const isLoggedIn = localStorage.getItem('isLoggedIn');
if (!isLoggedIn || isLoggedIn !== '1') {
  this.generalS.autoLogin.next(false);
  this.generalS.isAuthenticated.next(false);
} else {
  console.log('loggenInValue: ' + isLoggedIn);
  this.generalS.autoLogin.next(true);
  this.generalS.isAuthenticated.next(true);
}

И я получаю это в консоли

loggenInValue: 1

Поэтому субъекты autoLogin и isAuthenticated должны содержать true в качестве значения

Я слушаю это значение в компоненте заголовка, чтобы отобразить или скрыть ссылку login, но это не так. ничего не регистрировать

В компоненте заголовка

authSub: Subscription;
isAuthenticated: boolean;
ngOnInit() {
  this.authSub = this.generalS.isAuthenticated.subscribe( (data: boolean) => {
    this.isAuthenticated = data;
    console.log('authenticated: ' + data);
  });
}

Я не получаю никаких журналов из этого раздела. Есть идеи по решению этой проблемы? [Я знаю, что я не должен проверять функцию автологина, как это, но только для тестирования, чтобы проверить значение localStorage и изменить другие значения в зависимости от него]

1 Ответ

2 голосов
/ 24 января 2020

Так как я не знаю, где находится код именно в вашем authService. Я предполагаю, что вы звоните next () перед подпиской, что означает, что подписчиков пока нет. Субъекты только отправляют события существующим подписчикам, а не будущим.

Вы можете легко переключиться на ReplaySubject, если вы заинтересованы только в получении самой последней стоимости подписки:

isAuthenticated = new ReplaySubject(1);
autoLogin = new ReplaySubject(1);

https://rxjs-dev.firebaseapp.com/api/index/class/ReplaySubject

...