Подпишитесь на наблюдаемые данные в dataservice - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть приложение ionic 4, которое извлекает ошибки из конечной точки.Я хочу сохранить данные в свойстве на сервисе.

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

Моя служба обработки неисправностей находится ниже.Я звоню updateFaults, который находит неисправности и сохраняет их в this.faults.

export class FaultsService {

  private selectedFault: Fault;
  public faults: Fault[];

    constructor(private http: HttpClient) {}

   updateFaults() {
       this.http.get<Fault[]>('/api/faults').subscribe((data: any) =>
       {
         this.faults = data.data
       })
    }

    getFaultObservable() : Observable<Fault[]>
    {
      return of(this.faults)
    }

}

И на моей странице ngOnInit у меня есть такой метод:

ngOnInit() {
    this.faultsService.getFaultObservable().subscribe((faults: Fault[]) =>{
        console.log('update faults')
      this.faults = faults
      }
    )

Но когда язагрузить страницу, хотя это не ошибка.Ничего не отображается, и console.log не запущен.Поэтому я не уверен, что подписан правильно.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Служба может кэшировать извлеченные элементы и затем возвращать эти элементы к любым последующим вызовам, заключенным в наблюдаемую форму, используя of.Сам сервис может кэшировать результат вызова, используя tap.

. Вы должны держать кеширование отвлеченным от вызывающей стороны, поэтому сохраняйте поиск до 1 метода.Затем вызывающий абонент вызывает getFaults() и подписывается на возвращаемое наблюдаемое.Неважно, если это первый раз или 10-й раз, что касается вызывающего абонента.

import { map, tap } from 'rxjs/operators';
import { of } from 'rxjs';

export class FaultsService {

  faults: Fault[];

  constructor(private http: HttpClient) {}

  getFaults() : Observable<Fault[]> {
    return this.faults
        ? of(this.faults)
        : this.http.get<{data: Fault[]}>('/api/faults')
              .pipe(tap((data) => this.faults = data.data) // cache
                  , map((data) => data.data)); // return just Fault[] from data.data to the subscriber
    }
}
0 голосов
/ 28 февраля 2019

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

...