подписка на LoggedIn Observable не работает

#angular #typescript #observable

#angular #typescript #наблюдаемый

Вопрос:

Я хочу скрыть ссылки для входа и регистрации, как только я войду в систему с помощью службы в angular, но я получаю эту ошибку: введите описание изображения здесь

Вот мой сервисный код:

 import {Injectable} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {BlogPost} from '../models/blog-post';
import {Observable} from 'rxjs';
import {Channel} from '../models/channel';

@Injectable({
  providedIn: 'root'
})
export class BlogPostsService {

     private url = '/assets/data/';
     private loggedIn: Observable<boolean>;

     constructor(private httpClient: HttpClient) {
     }
     getBlogPosts(): Observable<BlogPost[]> {
        return this.httpClient.get<BlogPost[]>(this.url   'blog-post.json');
     }

     getChannels(): Observable<Channel[]> {
        return this.httpClient.get<Channel[]>(this.url   'channels.json');
     }

     setLoginStatus(data: Observable<boolean>) {
        this.loggedIn = data;
     }

     getLoginStatus(): Observable<boolean> {
        return this.loggedIn;
     }
}
 

Вот файл signin.component.ts, отправляющий код:

 onSubmit() {
let users = [];
users = Array.from(JSON.parse(localStorage.getItem('users')));
const selectedUser = users.filter(user => {
  return user.email === this.signInForm.value.email
    amp;amp; user.password === this.signInForm.value.password;
});
if (selectedUser.length === 1) {
  this.router.navigate(['/home']).then(r => {
    this.blogPostsService.setLoginStatus(r);
  });
} else {
  this.formError = true;
  setTimeout(() => {
    this.formError = false;
  }, 2000);
}
}
 

Затем в моем header.component.ts я пытаюсь получить loggedInStatus, но получил сообщение об ошибке на картинке выше. Пожалуйста, как мне это исправить?
header.component.ts

 import {Component, OnInit} from '@angular/core';
import {BlogPostsService} from '../services/blog-posts.service';

@Component({
    selector: 'app-header',
    templateUrl: './header.component.html',
    styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {

  loggedIn;

  constructor(private blogPostsService: BlogPostsService) {
  }

  ngOnInit(): void {
    this.loggedIn = this.blogPostsService.getLoginStatus()
      .subscribe(data => {
        this.loggedIn = data;
        console.log(this.loggedIn);
    });
 }

}
 

Комментарии:

1. вы возвращаете логическое значение, но не наблюдаемое

2. вместо этого создайте тему, а затем преобразуйте ее в Observable

Ответ №1:

В вашем BlogPostsService сервисе loggedIn нет наблюдаемой переменной, вы просто задали тип как наблюдаемый.

Вы можете напрямую получить доступ к значению без подписки,

   ngOnInit(): void {
    this.loggedIn = this.blogPostsService.getLoginStatus();
    this.loggedIn = data;
    console.log(this.loggedIn);
  } 

Если вы хотите выполнить подписку, вам необходимо внести изменения в BlogPostsService ,

of оператор импорта из rxjs,

  getLoginStatus(): Observable<boolean> {
    return of(this.loggedIn);
  } 

Комментарии:

1. но ссылки для входа и регистрации не скрывались. Пожалуйста, что мне сделать, чтобы скрыть и показать это?

Ответ №2:

1.In ваш сервис преобразуется loggedIn в субъект или субъект поведения

2. И верните его как наблюдаемый, например

 private loggedIn: Subject<boolean>;

getLoginStatus():Observable<boolean>{
   return this.loggedIn;
}

setLoginStatus(data:boolean) {
    this.loggedIn.next(data);
}
 

3. И, наконец, вы можете получить доступ loggedIn к своему header.component.ts следующим образом

 loggedIn$:Observable<boolean>
ngOnInit(): void {
  this.loggedIn$ = this.blogPostsService.getLoginStatus();
}
 

4. Вы можете использовать loggedIn$ в своем шаблоне использование асинхронного канала без необходимости подписки

 <h1 *ngIf="(loggedIn$ | async)">Signed In</h1>
 

Комментарии:

1. Получил эту ошибку: core.js: ОШИБКА 6241 Ошибка: не обнаружена (в обещании): ошибка типа: не удается прочитать свойство ‘next’ неопределенного типа Ошибка типа: не удается прочитать свойство ‘next’ неопределенного типа в BlogPostsService.setLoginStatus (blog-posts.service.ts:27)

2. Я был в состоянии понять, что делать. Ваш код верен, просто переменная LoggedIn должна быть объявлена как объект. Например: private LoggedIn = новая тема<логическое значение>(); Спасибо.

3. извините, я неправильно инициализировал тему. Рад, что вы в облаке разобрались