Angular 7 - Observable

0

Witam, uczę się angulara i nie rozumiem jednej rzeczy. W angularze stosuje sie takie coś jak observable ale nie rozumiem jak i nie rozumiem po co.

Przykład mamy tasks.service.ts

import { Injectable } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs';

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

  taskList: Array<string> = [];
  doneList: Array<string> = [];

  taskListObs = new BehaviorSubject<Array<string>>(this.taskList); //1
  doneListObs = new BehaviorSubject<Array<string>>(this.doneList);

  constructor() {
    this.taskList = ['Sprzątanie pokoju', 'Nauka Angulara', 'Podlewanie kwiatów', 'Zakupy']; //3
    this.taskListObs.next(this.taskList); //2
  }

Moje pytania:

  1. Czemu w momencie tworzenia muszę podać zmienną taskList skoro
  2. tutaj jest jakieś next i znowu podaje to samo czyli zmienna tasklist
  3. wartości są dane po zainicjowaniu obiektu czyli że za każdym razem muszę robić to next, tak?
  4. Jaka jest różnica pomiędzy Subject a BehaviorSubject?
  5. Nie lepiej po prostu dać w komponentach konstruktor serwisu a potem this.service.zmienna ?
1
  1. / 2. Nie musisz (czytaj pkt 4.).
  2. wywoływać next powinieneś za każdym gdy chcesz poinformować subskrybentów subjecta lub obserwabli o nowej wartości (np. nowa zmieniona lista tasków)
  3. Behaviour subject w przeciwieństwie do zwykłego subjecta inicjowany jest z pewną wartością początkową. Co więcej, przechowuje ostatnią emitowaną wartość do której można się odnieść wprost, bez subskrypcji (np. taskListObs.value). Przez co nie musisz w ogóle trzymać tych dwóch list taskList i doneList - twoje Behavior Subjecty już je trzymają wewnętrznie. Jest jeszcze jedna różnica - każdy subskrybent Behavior Subjecta Od razu otrzyma ostatnio wyemitowaną wartość.
  4. Nie lepiej. Jeżeli masz subskrypcję do subjecta / obserwabli to twój komponent może nasłuchiwać na zmianę pewnej wartości (np. zmieniła się lista tasków i teraz komponent wyświetlający taski musi dostosować widok).
    Jeżeli nie obchodzą cię zmiany stanu tasków w serwisie, to wtedy możesz po prostu się odnieść do wartości Behaviour Subjectu bez subskrypcji -> this.service.myBehaviorSubject.value
0

@matelener: dzięki, zaczynam rozumieć.
ad4. Jeszcze tylko zastanawia mnie czemu jeśli nie chciałbym nasłuchiwać zmiany to lepiej dać this.service.myBehaviorSubject.value.

Jak lepiej przesyłać informacje przez @input i @output czy przez serwisy i subjecty.

1

Powodzenia z przesyłaniem danych z wykorzystaniem @Input @Output po całym drzewie komponentów :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1