Наблюдаемое угловое и облачное хранилище не завершено - PullRequest
0 голосов
/ 08 января 2019

Я хочу показать сообщение или скрыть счетчик, когда наблюдаемое завершено, но наблюдаемое Пожарное хранилище бесконечно, я думаю. Другими словами это "горячо", как я понял. Spinner работает бесконечно в следующем коде. Так,

  1. Нет ли способа понять, завершено ли обнаружение Firestore?

  2. Если я попытаюсь скрыть счетчик в разделе ответа (данных), он будет работать так, как я хочу. Это правильный путь?

  3. Мне пришлось отписаться от наблюдаемого с помощью ngOnDestroy. Это из-за горячей наблюдаемой тоже? Я никогда раньше не использовал отписку. : /

Вот мой сервис и страница:

import { Injectable } from '@angular/core';
import { AngularFirestore, AngularFirestoreCollection } from 'angularfire2/firestore';
import { Dining } from '../_models/dining';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class DiningService {
  now = new Date();
  yesterday = new Date(this.now.getTime() - 1000 * 60 * 60 * 24 * 1);

  constructor(public db: AngularFirestore) {}

  getDining() {
    return this.db
      .collection<Dining>('Dining', ref => ref.where('date', '>', this.yesterday))
      .valueChanges();
  }
}

import { Component, OnInit, OnDestroy } from '@angular/core';
import { DiningService } from 'src/app/_services/dining.service';
import { Dining } from '../../_models/dining';
import { Subscription } from 'rxjs';

@Component({
  selector: 'app-dining',
  templateUrl: './dining.page.html',
  styleUrls: ['./dining.page.scss']
})
export class DiningPage implements OnInit, OnDestroy {
  list: Dining[] = [];
  msg: string;
  msgColor = '';
  subscription: Subscription;
  showSpinner = true;

  constructor(private diningService: DiningService) {}

  ngOnInit() {
    this.getDining();
  }

  getDining() {
    this.subscription = this.diningService.getDining().subscribe(
      res => {
        this.list = res;
        this.msg = this.list.length === 0 ? 'ERROR_DATA' : '';
        this.msgColor = this.list.length === 0 ? 'danger' : '';
        // this.showSpinner = false;
      },
      err => {
        console.error('Oops:', err.message);
        this.msg = 'ERROR_COM';
        // this.showSpinner = false;
      },
      () => {
        this.showSpinner = false;
      }
    );
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

1 Ответ

0 голосов
/ 08 января 2019

Все ваше понимание верно.

  1. Нет ли способа понять, завершено ли обнаружение Firestore?

    Обсерватория Firestore - это Observable, основанная на событиях, она всегда остается живой, чтобы слушать, если что-то изменилось в вашей БД. (Вы хотите, чтобы это было так). Таким образом, он не завершится сам, если вы не принудительно его выполните, например, с помощью take () , takeUntil () и т. Д. Операторов.

  2. Если я попытаюсь скрыть счетчик в разделе ответа (данных), он будет работать так, как я хочу. Это правильный путь?

    Да, это правильно, делайте это как с обратными вызовами «success», так и с «error».

  3. Мне пришлось отказаться от подписки наблюдаемого с помощью ngOnDestroy. Это из-за горячей наблюдаемой тоже? Я никогда не использовал отписку до

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

...