Wpis z mikrobloga

#programowanie #javascript #angular
Cześć, w skrócie: czy może mi ktoś poradzić jak podmienić observable array, na array który dostaje w resulcie responsa z api?

W skrócie korzystam z dynamicznego forma gdzie niektóre jego pola - selecty można filtrować, dane do tych pól trzymam w => filteredOptions: { [key: string]: Observable } = {}; gdzie key to controlName i observable to są itemy do tego selecta. Każde wpisanie w input powoduje przefiltrowanie listy dlatego musi to być observable.

Nie to jest problemem - problemem jest to, że do niektórych selectów mogę dodawać nowe itemy, po dodatniu itema leci zapis na BE i zwraca mi zaktualizowaną listę, chciałbym tą listę podmienić ale nie wiem jak to zrobić w sposób właściwy. Tutaj jest kod jak to wygląda obecenie (nie działa, ale operowałem na istniejącym w komponencie arrayu dodając nowy item, a teraz chcę całą listę zastąpić):

https://paste.ofcode.org/mGcM6Y38dLsbNGHJ3nUju7
  • 6
@Dominias: Efekty uboczne z Observable implementuje się zawsze w ciele .subscribe(). Samo .pipe się nigdy nie uruchomi, bez .subscribe().

Powinieneś robić emisję zdarzenia z nowym kontentem w ciele subscribe z calla do API.

Robi się to przez obiekt typu EventEmitter lub przez Subject - oba implementują interfejs Observable, więc możesz potem takie coś przekazać dalej (np. serwisem) i w docelowym komponencie robić .subscribe().
@Dominias: żeby wynik jednego Observable przekazać do innego Observable, to nie znam innego sposobu, niż ten, że musisz mieć w środku obiekt typu EventEmitter / Subject przy założeniu, że drugi Observable to ten sam obiekt co EventEmitter / Subject.

W jednym wołasz
.emit(...) (wrapper Angularowy - bo EventEmitter), a w drugim .next(...) (czysty RxJS - bo Subject`).
@patrolez: tzn. ja nie chce przekazywać observabla do observabla. Dla this.filteredOptions[field.Label] mam przypisany observable z listą itemów. Teraz w subie dostaję result który jest nową listą itemów więc dla this.filteredOptions[field.Label] chcę przypisać tą nową listę itemów jako observable. Na necie znalazłem coś takiego jak this.filteredOptions[field.Label] = of(result) zaraz sprawdzę czy zadziała
@Dominias: to jest prosta metoda do wycieków pamięci i mieszanie synchronicznych operacji z asynchronicznymi.

Nie mieszaj nigdy synchronicznych operacji z asynchronicznymi, bo to ci wyjdzie spod kontroli.
Aczkolwiek Angular jest bardzo tolerancyjny do mieszania tego.

Tutaj masz artykuł, który pozwoli ci wejść na kolejny poziom wtajemniczenia:
https://blog.angular-university.io/onpush-change-detection-how-it-works/

Chodzi o: changeDetection: ChangeDetectionStrategy.OnPush oraz używanie AsyncPipe.

Ogólnie Observable nie trzymają wartości, one są "końcówkami/uchwytami", które przepychają wartości, aby zostały obsłużone w miejscach,